刚开始的时候,没想到怎么设置源点,wa了几次,后来看到有用0点做源点的,试了一下,AC!!! #include <iostream> using namespace std; const int Max=100002; struct node{ int v,c,next; }edge[Max*3]; int edgehead[1002],vis[1002],dis[1002],k=0; int q[Max],head=0,rear=0; int cnt[1002]; void addedge(int u,int v,int c){ edge[k].v=v; edge[k].c=c; edge[k].next=edgehead[u]; edgehead[u]=k++; } bool spfa(int n){ int u,v,i,j; memset(cnt,0,sizeof(cnt)); dis[0]=0; vis[0]=1; cnt[0]++; q[head++]=0; while(head!=rear){ u=q[rear++];; vis[u]=0; for(i=edgehead[u];i!=-1;i=edge[i].next){ v=edge[i].v; if(dis[v]>dis[u]+edge[i].c){ dis[v]=dis[u]+edge[i].c; if(!vis[v]){ vis[v]=1; cnt[v]++; if(cnt[v]>n) return false; q[head++]=v; } } } } return true; } int main(int argc, char** argv) { int n,m,i,j,a,b,c; char t; while(scanf("%d%d",&n,&m)!=-1){ memset(dis,0x7F,sizeof(dis)); memset(edgehead,-1,sizeof(edgehead)); memset(vis,0,sizeof(vis)); k=head=rear=0; for(i=0;i<m;i++){ getchar(); scanf("%c%d%d",&t,&a,&b); if(t=='P'){ scanf("%d",&c); addedge(b,a,c); addedge(a,b,-c); } else addedge(a,b,-1); } for(i=1;i<=n;i++) addedge(0,i,0); //用0点来做源点 if(spfa(n)) printf("Reliable/n"); else printf("Unreliable/n"); } return 0; }