UVA - 558 Wormholes

来源:互联网 发布:软交换网络协议 编辑:程序博客网 时间:2024/05/21 09:02

题意:问是否存在负数环,两种判断方法: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;}