No.12 - POJ3259 SPFA求负权值回路 比Floyd快

SPFA求负权值回路:

注 : S P F A 求 负 权 值 回 路 要 比 F l o y d 快 ! \red{注:SPFA求负权值回路要比Floyd快!} SPFAFloyd

// ShellDawn
// POJ3259
// No.12

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define MM(x) memset(x,0,sizeof(x))
#define MMF(x) memset(x,0x3f,sizeof(x))
using namespace std;

#define maxn 505
int n,m,w;
int E[maxn][maxn][2];
int C[maxn];
int ans[maxn];
int dis[maxn];

bool SPFA(){
    MM(ans);
    MMF(dis);
    queue<int> q;
    q.push(1);
    ans[1]++;
    dis[1] = 0;
    while(!q.empty()){
        int loc = q.front();
        q.pop();
        for(int i=0;i<C[loc];i++){
            int next = E[loc][i][0];
            int v = E[loc][i][1];
            if(dis[loc] + v < dis[next]){
                dis[next] = dis[loc] + v;
                q.push(next);
                ans[next]++;
                if(ans[next] > n) return true;
            }
        }
    }
    return false;
}

int main(){
    //freopen("A.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--){
        MM(C);
        scanf("%d%d%d",&n,&m,&w);
        for(int i=0;i<m;i++){
            int a,b,v;
            scanf("%d%d%d",&a,&b,&v);
            int c = C[a];
            E[a][c][0] = b;
            E[a][c][1] = v;
            C[a] ++;
            c = C[b];
            E[b][c][0] =a;
            E[b][c][1] = v;
            C[b] ++;
        }
        for(int i=0;i<w;i++){
            int a,b,v;
            scanf("%d%d%d",&a,&b,&v);
            int c = C[a];
            E[a][c][0] = b;
            E[a][c][1] = -v;
            C[a] ++;
        }
        if(SPFA()) puts("YES");
        else puts("NO");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值