思路:
把所有“>”变成“≥” 把所有“<”变成“≤”(加一减一就好了)
然后我们发现:图不一定连通!!
怎么办呢
对于每一个连通块SPFA就好了嘛……
//By SiriusRen#include#include #include #include #define N 111using namespace std;char a[3],inq[N];int n,vis[N],xx,yy,zz,m,dis[N],cnt[N];int first[N],next[N*N],v[N*N],w[N*N],tot=0;void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}bool spfa(int x){ memset(cnt,0,sizeof(cnt)); memset(dis,0xcf,sizeof(dis)); memset(inq,0,sizeof(inq)); dis[x]=0;vis[x]=cnt[x]=1; queue q;q.push(x); while(!q.empty()){ int t=q.front();q.pop(); inq[t]=0;vis[t]=1; for(int i=first[t];~i;i=next[i]) if(dis[v[i]] n)return 0; } } } return 1;}int main(){ scanf("%d",&n); start:memset(first,-1,sizeof(first)); memset(vis,0,sizeof(vis)); scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d%s%d",&xx,&yy,a,&zz); if(a[0]=='g')add(xx-1,xx+yy,zz+1); else add(xx+yy,xx-1,-zz+1); } for(int i=0;i<=n;i++){ if(vis[i])continue; if(!spfa(i)){ puts("successful conspiracy"); goto end; } } puts("lamentable kingdom"); end:if(scanf("%d",&n)&&n)goto start;}