[POJ1094] Sorting It All Out
题目大意
给出$m$个不等式关系,问可以从第几个开始确定所有之间的大小关系。若无解请输出是无法确定还是与已知矛盾。
试题分析
这题是真的是坑啊,尽然放在$floyd$传到闭包上面,还用二分,是真的强啊。
其实一下子就会知道其实这是一道拓扑排序的题,所以当我们每次输入问一条边时,我们就去拓扑判断是否会形成环,条件是否充足,与顺序,然后就记得分类讨论即可。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> using namespace std; inline int read(){ int f=1,ans=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } queue<int> que; int n,m,in[27],d[27][27],find1,k[27]; char out[27]; char str[1001]; int topu(){ while(!que.empty()) que.pop(); for(int i=1;i<=27;i++) k[i]=in[i]; for(int i=1;i<=n;i++){if(!in[i]) que.push(i);} int sx=0,num=0; while(!que.empty()){ if(que.size()>1) sx=1; int xx=que.front();que.pop(); out[++num]=xx+'A'-1; for(int i=1;i<=26;i++){ if(d[xx][i]){ k[i]--; if(k[i]==0) que.push(i); } } } if(num!=n) return 1; if(sx==1) return -1; return 0; } int query,step; int main(){ // freopen("7.in","r",stdin); while(1){ memset(in,0,sizeof(in)),find1=0,query=0,step=0; memset(d,0,sizeof(d)); n=read(),m=read(); if(!n&&!m) return 0; for(int i=1;i<=m;i++){ cin>>(str+1); int u=str[1]-'A'+1,v=str[3]-'A'+1; if(str[2]=='>') swap(u,v); if(find1||query) continue; if(d[v][u]){find1=1;printf("Inconsistency found after %d relations.",i);continue;} if(!d[u][v]){ d[u][v]=1; in[v]++; } int pd=topu(); if(pd==0){query=1;step=i;continue;} if(pd==1){printf("Inconsistency found after %d relations.",i);find1=1;continue;} } if(query&&find1==0){ printf("Sorted sequence determined after %d relations: ",step); for(int i=1;i<=n;i++) cout<<out[i]; printf("."); } if(find1==0&&query==0) printf("Sorted sequence cannot be determined."); printf("\n"); } }