Wormholes.(POJ-3259)

最短路Bellman的算法,只需用到判断是否存在负圈的部分,因为只要存在负圈,则一定有一条路可以返回起点并且时间还原(一开始题意理解的不好,注意如果返回起点的时间为负数,其实也是可以的,应该是默认了返回起始时间,因为时间不能为负。)  所以,实质就是判断是否存在负圈。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int INF = 10000000;
int F,n,m,w,d[2000],all_edge,a,b,c;
struct edge{
    int from,to,cost;
    edge(int from = 0,int to = 0,int cost = 0) : from(from),to(to),cost(cost) {}
}s[6000];
bool bellman() {
    memset(d,0,sizeof(d));
    for(int i=0;i<n;i++) {
        for(int j=0;j<all_edge;j++) {
            edge e = edge(s[j].from,s[j].to,s[j].cost);
            if(d[e.to] > d[e.from] + e.cost) {
                d[e.to] = d[e.from] + e.cost;
                if(i==n-1) return true;
            }
        }
    }
    return false;
}
int main() {
    scanf("%d",&F) ;
    while(F--) {
        scanf("%d%d%d",&n,&m,&w);
        all_edge = 0;
        for(int i=1;i<=m;i++) {
            scanf("%d%d%d",&a,&b,&c);
            s[all_edge].from = a;
            s[all_edge].to = b;
            s[all_edge++].cost = c;
            s[all_edge].from = b;
            s[all_edge].to = a;
            s[all_edge++].cost = c;
        }
        for(int i=1;i<=w;i++) {
            scanf("%d%d%d",&a,&b,&c);
            s[all_edge].from = a;
            s[all_edge].to = b;
            s[all_edge++].cost = -c;
        }
        if(bellman()) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值