ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7-2 迪杰斯特拉方法实现最短路径

2021-11-25 15:31:35  阅读:142  来源: 互联网

标签:pre return int 迪杰 next edge 斯特拉 最短 dis


用迪杰斯特拉算法实现有向网的最短路径
输入格式:
第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的 两个点的及边上的权值,用空格间隔。最后一行输入要求路径的两个顶点。
输出格式:
输出最短路径经过的各顶点,中间用-->连接。

include

include

include

using namespace std;
const int N=1010;

struct edge{
int v,w;
edge* next;
};
struct node{
int k;
edge* next;
}a[1010];
int n;

int find(int u){
for(int i=0;i<n;i++){
if(a[i].k==u){
return i;
}
}
return -1;
}

void add(int u,int v,int w){
edge* e=new edge();
e->v=v;
e->w=w;
e->next=a[u].next;
a[u].next=e;
}

int dis[N],pre[N];
bool st[N];

void dijkstra(int u){
memset(pre,-1,sizeof pre);
memset(dis,0x3f,sizeof dis);
dis[u]=0;
for(int i=0;i<n-1;i++){
int k=-1;
for(int j=0;j<n;j++){
if(st[j]0&&(k-1||dis[j]<dis[k])){
k=j;
}
}
if(dis[k]==0x3f3f3f3f){
continue;
}
st[k]=1;
for(edge* j=a[k].next;j!=NULL;j=j->next){
int v=j->v,w=j->w;
if(dis[v]>dis[k]+w){
dis[v]=dis[k]+w;
pre[v]=k;
}
}
}
}

void showRoad(int v){
if(pre[v]!=-1){
showRoad(pre[v]);
cout<<"-->"<<a[v].k;
}else{
cout<<a[v].k;
}
}

int main(){
int m;
cin>>n>>m;

for(int i=0;i<n;i++){
    int k;
    cin>>k;
    a[i].k=k;
}

for(int i=0;i<m;i++){
    int u,v,w;
    cin>>u>>v>>w;
    int uu=find(u),vv=find(v);
    add(uu,vv,w);
}

int u,v;
cin>>u>>v;
dijkstra(u);

showRoad(v);

return 0;

}

标签:pre,return,int,迪杰,next,edge,斯特拉,最短,dis
来源: https://www.cnblogs.com/lyf3701/p/15602890.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有