poj3259 Bellman-Ford

还是一个求最短路径问题,不过不是求最短而是判断是否存在负权回路。

判断是否存在负权回路,当然要用Bellman-Ford算法了。

水题,不多说了,代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 555
#define inf 999999
using namespace std;
struct Edge
{
    int u,v;
    int t;
    Edge(int U=0,int V=0,int T=0)
    {
        u=U;v=V;t=T;
    }
};
Edge edge[10*MAX];
int dis[MAX];
int F,N,M,W;
bool Bellman_Ford(int nodenum,int edgenum,int original)
{
	for(int i = 1; i <= nodenum; ++i) //初始化
		dis[i] = (i == original ? 0 : inf);
	for(int i = 1; i <= nodenum - 1; ++i)
		for(int j = 1; j <= edgenum; ++j)
			if(dis[edge[j].v] > dis[edge[j].u] + edge[j].t) //松弛(顺序一定不能反~)
			{
				dis[edge[j].v] = dis[edge[j].u] + edge[j].t;
			}
    bool flag = 1; //判断是否含有负权回路
    for(int i = 1; i <= edgenum; ++i)
        if(dis[edge[i].v] > dis[edge[i].u] + edge[i].t)
        {
            flag = 0;
            break;
        }
    return flag;
}
void input()
{
    int i,j=1,s,e,t;
    scanf("%d",&F);
    while(F)
    {
        j=1;
        scanf("%d%d%d",&N,&M,&W);
        for(i=1;i<=M;i++)
        {
            scanf("%d%d%d",&s,&e,&t);
            edge[j++]=Edge(s,e,t);
            edge[j++]=Edge(e,s,t);
        }
        for(i=1;i<=W;i++)
        {
            scanf("%d%d%d",&s,&e,&t);
            edge[j++]=Edge(s,e,-1*t);
        }
        if(Bellman_Ford(N,2*M+W,1)) printf("NO\n");
        else printf("YES\n");
        F--;
    }
}
int main()
{
    input();
    return 0;
}

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/u013983192/article/details/37957495
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞