首页 > 编程语言 > 详细

带负边权的最短路径(有向图)——Bellman-Ford算法

时间:2019-09-04 16:49:52      阅读:87      评论:0      收藏:0      [点我收藏+]

参考了一位大佬的代码,一直很喜欢简洁的代码。(来源及出处已附上)

#include <iostream>
#include <cstring>
#include <cstdio>

#define MAX 100
#define INF 0x3f3f3f
using namespace std;
//有向图
struct Edge
{
    int u,v,cost;
}e[MAX];
int dist[MAX];  //最短路径
int prev[MAX];  //路径
int m,n;    //边数和顶点数

bool Bellman_Ford(int v0)
{
    int u=v0;
    for(int i=1;i<=n;i++)
        dist[i]=INF;
    dist[u]=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<m;j++)
            if(dist[e[j].v]>dist[e[j].u]+e[j].cost)
            {
                dist[e[j].v]=dist[e[j].u]+e[j].cost;
                prev[e[j].v]=e[j].u;
            }
    for(int i=0;i<m;i++)
        if(dist[e[i].v]>dist[e[i].u]+e[i].cost)
            return 0;
    return 1;
}

int main()
{
    cin>>n>>m;
    for(int i=0;i<m;i++)
        cin>>e[i].u>>e[i].v>>e[i].cost;
    if(Bellman_Ford(1))
        for(int i = 1; i <= n; ++i) //每个点最短路
        {
            printf("%d\n", dist[i]);
        }
    else
        printf("have negative circle\n");
    return 0;
}
————————————————
版权声明:本文为CSDN博主「weixin_43249938」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43249938/article/details/88217729

例题:

The Preliminary Contest for ICPC Asia Nanjing 2019  H. Holy Grail

样例输入:
1
10 15
4 7 10
7 6 3
5 3 3
1 4 11
0 6 20
9 8 25
3 0 9
1 2 15
9 0 27
5 2 0
7 3 -5
1 7 21
5 0 1
9 3 16
1 8 4
4 1
0 3
6 9
2 1
8 7
0 4
样例输出:
-11
-9
-45
-15
17
7

AC代码

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 #define MAX 900
 6 #define INF 0x3f3f3f
 7 using namespace std;
 8 struct Edge
 9 {
10     int u,v,cost;
11 }e[MAX];
12 int dist[MAX];  //最短路径
13 int m,n;    //边数和顶点数
14 
15 bool Bellman_Ford(int v0)
16 {
17     int u=v0;
18     for(int i=1;i<=n;i++)
19         dist[i]=INF;
20     dist[u]=0;
21     for(int i=1;i<=n;i++)
22         for(int j=0;j<m;j++)
23             if(dist[e[j].v]>dist[e[j].u]+e[j].cost)
24             {
25                 dist[e[j].v]=dist[e[j].u]+e[j].cost;
26             }
27     for(int i=0;i<m;i++)
28         if(dist[e[i].v]>dist[e[i].u]+e[i].cost)
29             return 0;
30     return 1;
31 }
32 
33 int main()
34 {    int T;
35     cin >> T; 
36     while(T--){
37         cin>>n>>m;
38         for(int i=0;i<m;i++){
39             int a,b,c;
40             cin >> a >> b >> c;
41             e[i].u = a+1;
42             e[i].v = b+1;
43             e[i].cost = c;
44         }
45         for(int i = 0 ; i < 6; i++){
46             int t1, t2;
47             cin >> t1 >> t2;
48             t1++;
49             t2++;
50             Bellman_Ford(t2);
51             int res = -dist[t1];
52             cout << res << endl;
53             e[m].u = t1;
54             e[m].v = t2;
55             e[m].cost = res;
56             m++;
57         }
58        
59     }
60     
61 
62     return 0;
63 }

 

带负边权的最短路径(有向图)——Bellman-Ford算法

原文:https://www.cnblogs.com/xyishere/p/11442751.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!