UVA - 558 Wormholes

题意:问是否存在负数环,两种判断方法:Bellman还有SPFA,临摹的模板

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 2010;
const int INF = 0x3f3f3f3f;

int u[MAXN],v[MAXN],t[MAXN];
int dis[MAXN],inq[MAXN],times[MAXN];
int n,m;
struct Edge{
    int v,t;
    Edge() {}
    Edge(int vv,int tt){
        v = vv,t = tt;
    }
};
vector<Edge> ver[MAXN];
int cnt = 0;

bool bellman(){
    for (int i = 0; i < n; i++)
        dis[i] = INF;
    dis[0] = 0;
    for (int k = 0; k < n-1; k++)
        for (int i = 0; i < m; i++){
            if (dis[u[i]] != INF && dis[v[i]] > dis[u[i]]+t[i])
                dis[v[i]] = dis[u[i]] + t[i];
        }
    for (int i = 0; i < m; i++)
        if (dis[u[i]] != INF && dis[v[i]] > dis[u[i]]+t[i])
            return true;
    return false;
}

bool spfa(){
    queue<int > q;
    for (int i = 0; i < n; i++){
        inq[i] = 0;
        times[i] = 0;
        dis[i] = INF;
    }
    inq[0] = 1;
    dis[0] = 0;
    q.push(0);
    while (!q.empty()){
        int cur = q.front();
        q.pop();
        inq[cur] = 0;
        times[cur]++;
        if (times[cur] > n)
            return true;
        for (int i = 0; i < ver[cur].size(); i++){
            int vv = ver[cur][i].v,tt = ver[cur][i].t;
            if (dis[cur] != INF && dis[vv] > dis[cur] + tt){
                dis[vv] = dis[cur] + tt;
                if (!inq[vv]){
                    inq[vv] = 1;
                    q.push(vv);
                }
            }
        }
    }
    return false;
}

int main(){
    int cas;
    scanf("%d",&cas);
    while (cas--){
        scanf("%d%d",&n,&m);
        for (int i = 0; i < n; i++)
            ver[i].clear();
        for (int i = 0; i < m; i++){
            int uu,vv,tt;
            scanf("%d%d%d",&uu,&vv,&tt);
            ver[uu].push_back(Edge(vv,tt));
        }
        if (spfa())
            printf("possible\n");
        else printf("not possible\n");
    }
    return 0;
}



你可能感兴趣的:(UVA - 558 Wormholes)