码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2544 最短路 (单源对短路,spfa,Dijkstra,Bellman-Ford)

时间:2015-06-30 21:40:15      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

 

 

题意:中文题目

思路: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 }
AC代码

 

HDU 2544 最短路 (单源对短路,spfa,Dijkstra,Bellman-Ford)

标签:

原文地址:http://www.cnblogs.com/xcw0754/p/4611515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!