POJ 2983 Is the Information Reliable?(差分约束系统+BellmanFord)

来源:互联网 发布:最新网络捕鱼平台 编辑:程序博客网 时间:2024/06/05 18:31
=号转化为>=,<=。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn=1000+5;struct edge{    int from,to,dist;};struct BellmanFord{    int n,m;    vector<edge> edges;    vector<int> G[maxn];    bool inq[maxn];    int d[maxn];    int cnt[maxn];        void init(int n){        this->n=n;        for(int i=0;i<n;i++) G[i].clear();        edges.clear();    }        void addedge(int from,int to,int dist){        edges.push_back((edge){from,to,dist});        m=(int)edges.size();        G[from].push_back(m-1);    }        bool negativeCycle(){        queue<int> q;        memset(inq,0,sizeof(inq));        memset(cnt,0,sizeof(cnt));        for(int i=0;i<n;i++) {d[i]=0;inq[0]=true;q.push(i);}                while(!q.empty()){            int u=q.front();q.pop();            inq[u]=false;            for(int i=0;i<G[u].size();i++){                edge &e=edges[G[u][i]];                if(d[e.to]>d[u]+e.dist){                    d[e.to]=d[u]+e.dist;                    if(!inq[e.to]) {inq[e.to]=true;q.push(e.to);if(++cnt[e.to]>n) return true;}                }            }        }        return false;    }};BellmanFord solver;int n,m;int main(){    while(~scanf("%d%d",&n,&m))    {        solver.init(n);        char ch[3];        int u,v,d;        for(int i=0;i<m;i++){            scanf("%s",ch);            if(ch[0]=='P'){                scanf("%d%d%d",&u,&v,&d);                u--;v--;                solver.addedge(v,u,d);                solver.addedge(u,v,-d);            }            else{                scanf("%d%d",&u,&v);                u--;v--;                solver.addedge(u,v,-1);            }        }        if(solver.negativeCycle()) printf("Unreliable\n");        else printf("Reliable\n");    }    return 0;}

0 0
原创粉丝点击