poj 3259

把 field 想象成一个图。如果要输出YES,则此图存在负圈。

使用Bellman-Ford算法,判断第 n 次是否仍然更新了。

使用Floyd-Warshall算法,判断是否有点的值小于原来的值。


Bellman-Ford算法:

#include <iostream>  
using namespace std;  
#define MAXM 2710  
#define MAXV 505  
#define inf 1<<29  
  
struct{  
    int x,y,t;  
}edge[MAXM];  
  
int n,m,w;  
  
int bellman_ford(int ids){  
    int i,j,d[MAXV],flag=1,cnt=1;  
    for(i=1;i<=n;i++) d[i]=inf;  
  
    while(flag){  
        flag=0;  
        if(cnt++>n) return 1;  
        for(i=1;i<=ids;i++){  
            if(d[edge[i].x]+edge[i].t < d[edge[i].y]) {
				d[edge[i].y] = d[edge[i].x] + edge[i].t;
				flag = 1;
			}  
        }

    }  
    return 0;  
}  
  
int main(){  
    int t,i;  
    scanf("%d",&t);  
    while(t--){  
        scanf("%d%d%d",&n,&m,&w); 
		
		int ids = m + w + 1; 
        for(i=1;i<=m;i++) {
        	scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].t);
        	edge[ids].x = edge[i].y;
        	edge[ids].y = edge[i].x;
        	edge[ids++].t = edge[i].t;
		} 
              
        for(; i<=m+w; i++) {
        	scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].t);
        	edge[i].t = -edge[i].t;
		}
        if(bellman_ford(ids)) printf("YES\n");  
        else printf("NO\n");  
    }  
    return 0;  
}


posted @ 2016-09-21 14:10  StevenLuke  阅读(136)  评论(0编辑  收藏  举报