hdu 1811 Rank of Tetris
http://acm.hdu.edu.cn/showproblem.php?pid=1811
拓扑排序和并差集
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <queue> 3 #include <vector> 4 #include <cstring> 5 #include <algorithm> 6 #define maxn 10010 7 using namespace std; 8 int n,m,c; 9 int f[maxn],in[maxn]; 10 vector<int>g[maxn]; 11 struct node 12 { 13 int x,y; 14 char ch; 15 }p[maxn*5]; 16 void inti() 17 { 18 for(int i=0; i<=n; i++) 19 { 20 f[i]=i; in[i]=0; 21 g[i].clear(); 22 } 23 } 24 25 int find1(int x) 26 { 27 if(x==f[x]) return x; 28 return f[x]=find1(f[x]); 29 } 30 31 void merge1(int a,int b) 32 { 33 int fa=find1(a); 34 int fb=find1(b); 35 if(fa!=fb) 36 { 37 f[fb]=fa; 38 } 39 } 40 41 int topp() 42 { 43 int flag=0; 44 queue<int>q; 45 for(int i=0; i<n; i++) 46 { 47 if(!in[i]&&find1(i)==i) q.push(i); 48 } 49 int cnt=0; 50 while(!q.empty()) 51 { 52 if(q.size()>=2) flag=-1; 53 int x=q.front(); q.pop(); 54 cnt++; 55 for(int i=0; i<(int)g[x].size(); i++) 56 { 57 if((--in[g[x][i]])==0) q.push(g[x][i]); 58 } 59 } 60 if(cnt<c) return 1; 61 return flag; 62 } 63 int main() 64 { 65 while(~scanf("%d%d",&n,&m)) 66 { 67 inti(); 68 c=n; 69 for(int i=0; i<m; i++) 70 { 71 scanf("%d%*c%c%*c%d",&p[i].x,&p[i].ch,&p[i].y); 72 if(p[i].ch=='=') 73 { 74 merge1(p[i].x,p[i].y); c--; 75 } 76 } 77 bool flag=false; 78 for(int i=0; i<m; i++) 79 { 80 if(p[i].ch=='=') 81 { 82 continue; 83 } 84 int x1=find1(p[i].x); int y1=find1(p[i].y); 85 if(x1==y1) flag=true; 86 if(p[i].ch=='<') 87 { 88 if(find(g[x1].begin(),g[x1].end(),y1)==g[x1].end()) 89 { 90 g[x1].push_back(y1); 91 in[y1]++; 92 } 93 } 94 else if(p[i].ch=='>') 95 { 96 if(find(g[y1].begin(),g[y1].end(),x1)==g[y1].end()) 97 { 98 g[y1].push_back(x1); 99 in[x1]++; 100 } 101 } 102 } 103 bool flag1=false; 104 if(!flag) 105 { 106 int cc=topp(); 107 if(cc==1) flag=true; 108 else if(cc==-1) flag1=true; 109 } 110 if(flag) 111 { 112 printf("CONFLICT\n"); 113 } 114 else if(flag1) 115 { 116 printf("UNCERTAIN\n"); 117 } 118 else printf("OK\n"); 119 } 120 return 0; 121 }