差分约系统。
至于等于就大于等于且小于等于。
发现以前的spfa板子有问题,点要提前出队,才能判自环。
code:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int x,y,c,next;
}a[2110000];int len=0,last[500010];
int n,m;
void ins(int x,int y,int c)
{
a[++len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len;
}
queue<int> q;
int d[500010],ru[500010];
bool u[500010];
bool spfa()
{
memset(d,0,sizeof(d));
memset(ru,0,sizeof(ru));
memset(u,true,sizeof(u));
for(int i=0;i<=n;i++) q.push(i);
while(!q.empty())
{
int x=q.front();u[x]=false;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(d[x]+a[i].c>d[y])
{
d[y]=d[x]+a[i].c;
ru[i]++;if(ru[i]>n) return false;
if(!u[y]) u[y]=true,q.push(y);
}
}
q.pop();
}
return true;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(last,0,sizeof(last));len=0;
for(int i=1;i<=m;i++)
{
char s[5];
scanf("%s",s+1);
if(s[1]=='P')
{
int x,y,c;scanf("%d %d %d",&x,&y,&c);
ins(x,y,c);ins(y,x,-c);
}
else
{
int x,y;scanf("%d %d",&x,&y);
ins(x,y,1);
}
}
if(spfa()) printf("Reliable\n");
else printf("Unreliable\n");
}
}