poj2983(查分约束)

来源:互联网 发布:程序员需求量 编辑:程序博客网 时间:2024/09/21 11:14

链接:点击打开链接

题意:给出n个点,和m种关系,看是否能够满足所有关系,关系的形式有两种一种是u-v=w,一种是u-v>=1

代码:

#include <queue>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int n,d[1005],deg[1005],vis[1005];struct node{    int to,val;};vector<node> G[1005];int spfa(int S){    int i,u,v,w;    for(i=0;i<=n;i++){        d[i]=INF;        vis[i]=deg[i]=0;    }    queue<int> qu;    d[S]=0,deg[S]=vis[S]=1;    qu.push(S);    while(qu.size()){        u=qu.front();        qu.pop();        vis[u]=0;        for(i=0;i<G[u].size();i++){            v=G[u][i].to;            w=G[u][i].val;            if(d[v]>d[u]+w){                d[v]=d[u]+w;                if(vis[v]==0){                    deg[v]++;                    if(deg[v]>n)                    return 0;                    qu.push(v);                }            }        }    }    return 1;}int main(){    char ch;    int m,u,v,w,i;    while(scanf("%d%d",&n,&m)!=EOF){        for(i=0;i<=n;i++)                       //三个约束条件        G[i].clear();                           //u-v<=w        for(i=1;i<=m;i++){                      //v-u<=-w            cin>>ch;                            //v-u<=1            if(ch=='P'){                        //直接差分约束,跑最短路,看是否有负环                scanf("%d%d%d",&u,&v,&w);                G[v].push_back((node){u,w});                G[u].push_back((node){v,-w});            }            else{                scanf("%d%d",&u,&v);                G[u].push_back((node){v,-1});            }        }        for(i=1;i<=n;i++)                       //建一个超级源点使图联通        G[0].push_back((node){i,0});        if(spfa(0))        puts("Reliable");        else        puts("Unreliable");    }    return 0;}

原创粉丝点击