bellman-ford算法模板

来源:互联网 发布:四维设计软件 编辑:程序博客网 时间:2024/06/15 16:21
#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 1005const int inf = 0x3f3f3f3f;using namespace std;int n, m;int dis[MAXN],u[MAXN],v[MAXN],w[MAXN];void bellford(int start){for (int i = 1; i <= n; i++)dis[i] = inf;dis[start] = 0;for (int k = 1; k <= n - 1; k++)//外部循环n-1次{int flag = 0;for (int i = 1; i <= m; i++)//按边松弛{if (dis[u[i]] < inf && dis[v[i]] > dis[u[i]] + w[i]){dis[v[i]] = dis[u[i]] + w[i];flag = 1;}}if (!flag)break;//本轮dis数组没有更新,直接退出结束算法。}}int judge(){int flag = 0;for (int i = 1; i <= m; i++){if (dis[v[i]] > dis[u[i]] + w[i])flag = 1;break;}if (flag){printf("此图含有负权回路\n");return 0;}else return 1;}void print(){for (int i = 1; i <= n; i++)printf("%d ", dis[i]);printf("\n");}int main(){while (scanf("%d%d", &n, &m) != EOF && (n || m)){//读入边for (int i = 1; i <= m; i++)scanf("%d%d%d", &u[i], &v[i], &w[i]);int start;//读入起点scanf("%d", &start);bellford(start);if (judge())print();}return 0;}

0 0
原创粉丝点击