poj3259 Bellman-Ford

来源:互联网 发布:看门狗低配置优化补丁 编辑:程序博客网 时间:2024/05/23 15:51

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

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

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

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>#define MAX 555#define inf 999999using 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;}


 

0 0
原创粉丝点击