最短路径之Bellman-Ford算法

第一行为源点个数,边的个数m

接下来m行为a->b和权值

5 5
2 3 2
1 2 -3
1 5 5
4 5 2
3 4 3

Bellman-Ford算法(1):

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define inf 1000000000
 5 using namespace std;
 6 int main()
 7 {
 8     int dis[100], u[100], v[100], w[100];
 9     int n, m;
10     cin >> n >> m;
11     for (int i = 1; i <= m; i++)
12         cin >> u[i] >> v[i] >> w[i];
13     for (int i = 1; i <= n; i++)
14         dis[i] = inf;
15     dis[1] = 0;
16     for (int k = 1; k < n; k++)
17         for (int i = 1; i <= m; i++)
18             dis[v[i]] = min(dis[v[i]], dis[u[i]] + w[i]);
19     for (int i = 1; i <= n; i++)
20         cout << dis[i] << " ";
21     return 0;
22 }

 (2)

 1 #include<iostream>
 2 #include<queue>
 3 #include<algorithm>
 4 using namespace std;
 5 #define inf 1000000000
 6 struct  edge
 7 {
 8     int from, to, cost;
 9 };
10 edge es[10000];
11 int d[100], V, E;
12 void path(int s)
13 {
14     for (int i = 0; i <= V; i++) d[i] = inf;
15     d[s] = 0;
16     while (true)    
17     {
18         bool update = false;
19         for (int i = 0; i < E; i++)
20         {
21             edge e = es[i];
22             if (d[e.from] != inf&& d[e.to]>d[e.from] + e.cost)
23             {
24                 d[e.to] = d[e.from] + e.cost;
25                 update = true;
26             }     
28         }
29         if (!update) break;
30     }
31     for (int i = 1; i <= V; i++)
32         cout << d[i] << " ";
33 }
34 int main()
35 {
36     cin >> V >> E;
37     for (int i = 0; i < E; i++)
38     {
39         cin >> es[i].from >> es[i].to >> es[i].cost;
40     }
41     path(1);
42     return 0;
43 }

 

posted @ 2018-04-15 17:54  zzuli风尘  阅读(190)  评论(0编辑  收藏  举报