同上...用SPFA...发现了一些值得注意的地方...
首先这个题的 Si...i是从0开始的....所以如果用超级源点..不能用0点..所以我干脆就没用超级点...直接开始的时候所有点入队~~效果是一样的
上面贴的Bellman-Ford有个很大的错误...就是 line [ ] 的有向边都搞反了....但Bellman-Ford本来就是无序的...并且只要判断有没有环..所以照样AC..
但SPFA就不同...是什么图就要是什么图...Dizzy....这里卡了好久才检查出来..因为没想到这里会错...
Program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#define ok printf("ok!!\n")
#include<queue>
using namespace std;
struct pp
{
int x,y,k,next;
}line[110];
int n,m,i,link[110];
char c;
queue<int> myqueue;
bool SPFA()
{
int i,j,k,h,d[110],sum[110];
bool used[110];
while (!myqueue.empty()) myqueue.pop();
for (i=0;i<=n;i++)
{
myqueue.push(i);
used[i]=true;
d[i]=0;
sum[i]=1;
}
while (!myqueue.empty())
{
h=myqueue.front();
myqueue.pop();
used[h]=false;
k=link[h];
while (k)
{
if (d[line[k].y]>d[h]+line[k].k)
{
d[line[k].y]=d[h]+line[k].k;
if (!used[line[k].y])
{
myqueue.push(line[k].y);
sum[line[k].y]++;
if (sum[line[k].y]>n) return false;
used[line[k].y]=true;
}
}
k=line[k].next;
}
}
return true;
}
int main()
{
while (~scanf("%d",&n))
{
if (!n) break;
int x,y,k;
scanf("%d",&m);
memset(link,0,sizeof(link));
memset(line,0,sizeof(line));
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
y=x+y;
c=getchar();
while (c==' ') c=getchar();
getchar();
scanf("%d",&k);
if (c=='g')
{
line[i].x=y; line[i].y=x-1; line[i].k=-k-1;
}else
{
line[i].x=x-1; line[i].y=y; line[i].k=k-1;
}
line[i].next=link[line[i].x]; link[line[i].x]=i;
}
if (SPFA()) printf("lamentable kingdom\n"); else printf("successful conspiracy\n");
}
return 0;
}