poj3259 Bellman_ford算法

//poj3259 类似 poj1860, 探求能否出发,然后通过虫洞在出发前的时间点回来 
//如果单源最短路径构造之后,发现还是可以继续构造下去,说明某条路可以实现时间一直减的效果
//无限次走这条路,就可以达到目标。 
//dist的初始化大小搞错了 害的我WA了1次,RE了2次。。 
#include <iostream>
#include <string>
using namespace std;
int num;  //边数 
int dist[505];
int inf = 10005;
struct edge{
    int st;
    int ed;
    int w;
}e[6000];
void addEdge(int st, int ed, int t)
{
    e[num].st = st;
    e[num].ed = ed;
    e[num++].w = t;
}
bool CC(int nodeNum)
{
    for(int i = 0; i <= nodeNum; i++)
    {
        dist[i] = inf;	
    }
    dist[1] = 0;
    //构造单源(1)最短路径表
    bool flag = false; 
    for(int i = 0; i < nodeNum; i++)
    {
        for(int j = 0; j < num; j++)
        {
            int u = dist[e[j].st];
            int v = dist[e[j].ed];
            if(v > u + e[j].w)
            {
                dist[e[j].ed] = u + e[j].w;
                flag = true;
            }
        }
        if(!flag)
            break;
    } 
    for(int i = 0; i < num; i++)
    {
        if(dist[e[i].ed] > dist[e[i].st] + e[i].w) //如果还存在着负权环 
            return true;
    }
    return false;
}
int main()
{
    int f;
    cin>>f;
    while(f--)
    {
        num = 0;
        int n, m, worm;
        cin>>n>>m>>worm;
        int st, ed, t;
        for(int i = 0; i < m; i++)
        {
            cin>>st>>ed>>t;
            addEdge(st, ed, t);
            addEdge(ed, st, t);
        }
        for(int i = 0; i < worm; i++)
        {
            cin>>st>>ed>>t;
            addEdge(st, ed, -t);
        }	
        bool ok = CC(n);
        if(ok)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

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