1. 程式人生 > >[POJ1094] Sorting It All Out

[POJ1094] Sorting It All Out

link

題目大意

給出$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"); } }
View Code