UVA 558 判定负环,spfa模板题

1、UVA 558 Wormholes   

2、总结:第一个spfa,好气的是用next[]数组判定Compilation error,改成nexte[]就过了。。难道next还是特殊词吗

题意:科学家,虫洞。就是判定负环

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=1010,M=2010,MAX=1000100;

int n,m;
int v[M],u[M],w[M],nexte[M],head[N],num[N],dis[N],vis[N];

void read_gragh()
{
    mes(head,-1);
    scanf("%d%d",&n,&m);
    FF(e,1,m){
        scanf("%d%d%d",&u[e],&v[e],&w[e]);
        nexte[e]=head[u[e]];
        head[u[e]]=e;
    }
}

bool spfa()
{
    mes(vis,0);mes(num,0);
    mes(dis,INF);
    dis[0]=0;
    queue<int>q;q.push(0);
    num[0]++;
    while(!q.empty())
    {
        int node=q.front();q.pop();
        vis[node]=0;
        for(int e=head[node];e!=-1;e=nexte[e]){
            if(dis[v[e]]>dis[node]+w[e]){
                dis[v[e]]=dis[node]+w[e];
                if(!vis[v[e]]){
                    vis[v[e]]=1;
                    q.push(v[e]);
                    num[v[e]]++;
                    if(num[v[e]]>=n)return true;
                }
            }
        }
    }

    return false;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        read_gragh();
        if(spfa())puts("possible");
        else puts("not possible");
    }

    return 0;
}
View Code

 

posted @ 2016-09-27 21:16  v9fly  阅读(197)  评论(0编辑  收藏  举报