同上...用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; }