poj3259 Bellman_Ford

/**
 * poj3259 Bellman-Ford
 * 这个题最开始的时候有点钻牛角尖了,只记得Bellman_Ford是单源,而这个题并没有指定源是哪个,就用了Floyd,结果不对
 * 想了下,Floyd好像并没有负向环路判断的功能,而这个题只是要检测负向环路,起点在哪里根本就无所谓,选一个根本都不存在的起点都可以
 * 于是果断改用BF了
 */
#include <cstdio>

int f;
int n,m,w;
int idx;

struct path{
    int start;
    int end;
    int cost;
}p[5300];
int timecost[501];

bool bellman_ford(){//有环路返回false
    bool flag;
    for(int i=0;i<n;++i){
        flag = false;
        for(int j=0;j<idx;++j){
            if(timecost[p[j].end] > timecost[p[j].start] + p[j].cost){
                timecost[p[j].end] = timecost[p[j].start] + p[j].cost;
                flag = true;
            }
        }
        if(!flag){
            break;
        }
    }


    for(int j=0;j<idx;++j){
        if(timecost[p[j].end] > timecost[p[j].start] + p[j].cost){
            return false;
        }
    }
    return true;
}

int main(){
    int a,b,tcost;
    scanf("%d",&f);
    while(f--){
        idx = 0;
        scanf("%d%d%d",&n,&m,&w);
        for(int i=1;i<=n;++i){
            timecost[i] = 1<<30;
        }

        for(int i=1;i<=m;++i){
            scanf("%d%d%d",&a,&b,&tcost);
            p[idx].start = a;
            p[idx].end = b;
            p[idx++].cost = tcost;
            p[idx].start = b;
            p[idx].end = a;
            p[idx++].cost = tcost;
        }
        for(int i=1;i<=w;++i){
            scanf("%d%d%d",&a,&b,&tcost);
            p[idx].start = a;
            p[idx].end = b;
            p[idx++].cost = tcost*-1;
        }

        if(bellman_ford()){
            printf("NO\n");
        }
        else{
            printf("YES\n");
        }

    }    

    return 0;
}

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