标签:
这题作为模板题,解法好多...
最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习。
暂时只有SPFA的
SPFA (邻接表版。也可以写成临接矩阵存图,但题目可能给出平行边的,所以要注意找最小的边储存,还要注意判断一个点是否多次进入队列)老实说觉得SPFA好像只是被队列优化过的搜索一样的..
1 #include <stdio.h>
2 #include <algorithm>
3 #include <iostream>
4 #include <string.h>
5 #include <utility>
6 #include <vector>
7 #include <queue>
8 #define MAXX 10010
9 using namespace std;
10
11 const int N = 250;
12 const int INF = 0x3f3f3f3f;
13
14
15 typedef struct sion
16 {
17 int dis;
18 int nxp;
19 }sion;
20
21 int dic[N];
22 bool vis[N];
23 vector<sion>li[N];
24
25
26 int spfa(int &s, int &t)
27 {
28 queue<int>q;
29 q.push(s);
30 vis[s] = 1;
31 dic[s] = 0;
32 while(!q.empty())
33 {
34 int pre = q.front();
35 q.pop();
36 for(int i = 0; i < li[pre].size(); i++)
37 {
38 // cout << dic[li[pre][i].nxp] << "~";
39 if(dic[li[pre][i].nxp] > dic[pre] + li[pre][i].dis)
40 {
41 dic[li[pre][i].nxp] = dic[pre] + li[pre][i].dis;
42 q.push(li[pre][i].nxp);
43 // cout << dic[li[pre][i].nxp] << "!";
44 }
45 }
46
47 }
48 return dic[t];
49 }
50
51 void init()
52 {
53 memset(vis,false,sizeof(vis));
54 memset(dic,INF,sizeof(dic));
55 for(int i = 0; i < N; i++)
56 li[i].clear();
57 return ;
58 }
59
60 int main()
61 {
62 int n, m;
63 int s, t;
64 while(cin >> n >> m)
65 {
66 init();
67 sion a;
68 int x;
69 for(int i = 0; i < m; i++)
70 {
71 scanf("%d%d%d",&x, &a.nxp, &a.dis);
72 li[x].push_back(a);
73 int temp = a.nxp;
74 a.nxp = x;
75 li[temp].push_back(a);
76 }
77 scanf("%d%d", &s, &t);
78 int y = spfa(s, t);
79 if(y >= INF)
80 {
81 printf("-1\n");
82 }
83 else printf("%d\n", y);
84 }
85 }
HDU 1874 SPFA/BellmanFord/Dijkstra/Floyd
标签:
原文地址:http://www.cnblogs.com/Yumesenya/p/5618640.html