标签:初始化 最短路 不同的 均值 存储 利用 元素 连接 ring
主要思想是:
1 //spfa 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 const int maxn=0x7f; 8 bool vis[1001]; 9 int map[1001][1001],dis[1001],queue[1001],path[1001]; 10 int n,m,head=0,tail=1,now; 11 12 13 void spfa(int x) 14 { 15 queue[head]=x; 16 vis[x]=true; 17 dis[x]=0; 18 path[x]=x; 19 while(head<tail) 20 { 21 now=queue[head]; 22 for(int i=1;i<=n;i++) 23 { 24 if(dis[i]>dis[now]+map[now][i]) 25 { 26 dis[i]=dis[now]+map[now][i]; 27 path[i]=now; 28 if(vis[i]==false) 29 { 30 queue[tail++]=i; 31 vis[i]=true; 32 } 33 } 34 } 35 vis[now]=false; 36 head++; 37 } 38 } 39 void print(int st,int en) 40 { 41 int q[1001]; 42 int tot=1; 43 q[tot]=en; 44 tot++; 45 int temp=path[en]; 46 while(temp!=st) 47 { 48 q[tot]=temp; 49 tot++; 50 temp=path[temp]; 51 } 52 q[tot]=st; 53 for(int i=tot;i>=1;i--) 54 { 55 if(i!=1) 56 printf("%d -- >",q[i]); 57 else 58 printf("%d",q[i]); 59 } 60 cout<<endl; 61 } 62 int main() 63 { 64 memset(map,maxn,sizeof(map)); 65 scanf("%d%d",&n,&m); 66 int he,ta,len; 67 for(int i=1;i<=m;i++) 68 { 69 cin>>he>>ta>>len; 70 map[he][ta]=map[ta][he]=len; 71 } 72 memset(dis,maxn,sizeof(dis)); 73 memset(vis,false,sizeof(vis)); 74 memset(queue,0,sizeof(queue)); 75 int start,end; 76 scanf("%d%d",&start,&end); 77 spfa(start); 78 printf("%d\n",dis[end]); 79 print(start,end); 80 return 0; 81 }
标签:初始化 最短路 不同的 均值 存储 利用 元素 连接 ring
原文地址:http://www.cnblogs.com/sssy/p/6689553.html