hdu 1811 Rank of Tetris
//并查集+拓扑排序,‘=’ 用并查集处理
#include<iostream> #include<queue> #include<vector> using namespace std; vector<int>next[10005]; //相当于邻接表 int set[10005]; //并查集数组 int in[10005]; //记录入度 int A[20005],B[20005]; char oper[20005]; int n,m,sum; int find(int x) { return set[x]==x?x:find(set[x]); } int merge(int x,int y) { int a=find(x); int b=find(y); if(a==b) return 0; set[b]=a; return 1; } void topo() { int uncertain=0; queue<int>Q; for(int i=0;i<n;i++) if(in[i]==0 && find(i)==i) Q.push(i); while(!Q.empty()){ if(Q.size()>1) uncertain=1; //容器中有多于一个的元素,就无法排序 int t=Q.front(); Q.pop(); sum--; for(int i=0;i<next[t].size();i++) if(--in[next[t][i]]==0) Q.push(next[t][i]); } if(sum>0) puts("CONFLICT"); //还有元素未排序,证明存在环 else if(uncertain) puts("UNCERTAIN"); else puts("OK"); } int main(void) { while(scanf("%d%d",&n,&m)!=EOF) { sum=n; for(int i=0;i<n;i++){ set[i]=i; in[i]=0; next[i].clear(); } for(int i=0;i<m;i++){ scanf("%d %c %d",&A[i],&oper[i],&B[i]); if(oper[i]=='=') if(merge(A[i],B[i])) sum--; } for(int i=0;i<m;i++){ if(oper[i]=='=') continue; int a=find(A[i]); int b=find(B[i]); if(oper[i]=='>'){ next[a].push_back(b); //插入元素 in[b]++; }else{ next[b].push_back(a); in[a]++; } } topo(); } return 0; }