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;  
}


转载于:https://www.cnblogs.com/StevenL/p/6818369.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值