POJ3259 - Wormholes - 判负环模板题

Posted ofshk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3259 - Wormholes - 判负环模板题相关的知识,希望对你有一定的参考价值。

题意:判负环。

思路:SPFA模板题。

PS:抽个时间把SPFA写下这道题目。

Dijkstra做法:

#include<iostream>
#include<iomanip>
#include<string.h>
#include<set>
#include<stdio.h>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;

int u[7550],v[7550],w[7550],dis[7550];
int bak[2550];
int main()
{
//    std::ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    int f,n,m,ww;
    cin>>f;
    while(f--)
    {
        cin>>n>>m>>ww;
        int aa,bb,cc;
        int p=1;
        for(int i=1; i<=m+ww; i++)
        {
            cin>>aa>>bb>>cc;
            if(i<=m)
            {
                u[p]=aa;
                v[p]=bb;
                w[p]=cc;
                p++;

                u[p]=bb;
                v[p]=aa;
                w[p]=cc;
                p++;
            }
            else
            {
                u[p]=aa;
                v[p]=bb;
                w[p]=-cc;
                p++;
            }
        }

        for(int i=1; i<=n; i++)
            dis[i]=inf;
        dis[1]=0;
        int check;
        for(int k=1; k<=n-1; k++)
        {
            check=0;
            for(int i=1; i<=m*2+ww; i++)
            {
                if(dis[v[i]]>dis[u[i]]+w[i])
                {
                    dis[v[i]]=dis[u[i]]+w[i];
                    check=1;
                }
            }
            if(check==0)
                break;
        }

        int flag=0;
        for(int i=1; i<=m*2+ww; i++)
        {
            if(dis[v[i]]>dis[u[i]]+w[i])
                flag=1;
        }
        if(flag)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

以上是关于POJ3259 - Wormholes - 判负环模板题的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3259 Wormholes(SPFA判负环)

「POJ3259」Wormholes - SPFA判负环

POJ-3259 Wormholes(判负环,spfa算法)

POJ #3259 Wormholes 判负环

POJ 3259 Wormholes spfa 判负环

POJ3259 - Wormholes - 判负环模板题