标签:
题意:中文题目
思路:spfa+SLF优化。关于SPFA的详情请戳我
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=105, INF=0x7f7f7f7f; 4 int n, m; 5 bool vis[N]; //标记是否在队列中 6 int dest[N]; //路径长度 7 int mapp[N][N]; 8 9 10 11 int spfa(int s, int e) //求最短路径 12 { 13 memset(dest,0x7f,sizeof(dest)); 14 dest[s]=0; 15 vis[s]=1; 16 deque<int> que; 17 que.push_back(s); 18 while(!que.empty()) 19 { 20 int tmp=que.front(); 21 que.pop_front(); 22 vis[tmp]=0; 23 for(int i=1; i<=n; i++) 24 { 25 if(mapp[tmp][i] && dest[tmp]+mapp[tmp][i]<dest[i] ) 26 { 27 dest[i]=dest[tmp]+mapp[tmp][i]; 28 if(!vis[i]) //一旦被更新,必须进队列 29 { 30 vis[i]=1; 31 if(que.empty()) que.push_back(i); //SLF优化,路短的优先放前面 32 else 33 { 34 if(dest[que.front()]>dest[i]) 35 que.push_front(i); 36 else 37 que.push_back(i); 38 } 39 } 40 } 41 } 42 } 43 return dest[e]; 44 } 45 46 47 48 49 int main() 50 { 51 //freopen("input.txt", "r", stdin); 52 int a, b, c; 53 while(scanf("%d%d", &n, &m), n+m) 54 { 55 memset(vis,0,sizeof(vis)); 56 memset(mapp,0,sizeof(mapp)); 57 58 for(int i=0; i<m; i++) 59 { 60 scanf("%d%d%d",&a,&b,&c); 61 mapp[a][b]=mapp[b][a]=c; 62 } 63 printf("%d\n",spfa(1,n)); 64 } 65 66 return 0; 67 }
HDU 2544 最短路 (单源对短路,spfa,Dijkstra,Bellman-Ford)
标签:
原文地址:http://www.cnblogs.com/xcw0754/p/4611515.html