拓扑排序

hdu 1811 Rank of Tetris 

注意一些特殊情况View Code
 1 #include<iostream>
2 #include<cstdio>
3 #include<vector>
4 #include<cstring>
5 #include<cmath>
6 #include<queue>
7 #include<cstdlib>
8 #include<algorithm>
9 using namespace std;
10 const int MAX=110000;
11 const int INF=100000000;
12 int f[MAX],into[MAX],vis[MAX];
13 int n,m;
14 vector<int> G[MAX];
15 queue<int> q;
16 int ans;
17 int find(int x){
18 if(x==f[x]) return x;
19 return f[x]=find(f[x]);
20 }
21 void TopologicalSort() {
22 ans=0; int sum=0;
23 if(!q.empty()) q.pop();
24 for(int i=0;i<n;i++){
25 if(!into[f[i]]&&f[i]==i){
26 q.push(f[i]);
27 }
28 }
29 memset(vis,0,sizeof(vis));
30 while(!q.empty()){
31 if(q.size()>1) ans=1;
32 int u=q.front(); q.pop();
33 vis[u]=1;
34 for (int k=0;k<G[u].size();k++){
35 int v=G[u][k];
36 into[v]--;
37 if(!into[v]){
38 q.push(v);
39 }
40 }
41 }
42 for(int i=0;i<n;i++) if(!vis[f[i]]) { ans=2; return ;}
43 }
44 struct node{
45 int x,y;
46 char s;
47 };
48 int main(){
49 while(scanf("%d%d",&n,&m)!=EOF){
50 for(int i=0;i<n;i++) {
51 f[i]=i;
52 G[i].clear();
53 }
54 vector<node> v;
55 node B;
56 memset(into, 0, sizeof(into));
57 for(int i=0;i<m;i++){
58 char s[5]; int x,y;
59 scanf("%d%s%d",&x,s,&y);
60 int rx=find(x),ry=find(y);
61 if(s[0]=='=') f[ry]=rx;
62 else {
63 B.x=x; B.y=y; B.s=s[0];
64 v.push_back(B);
65 }
66 }
67 for(int i=0;i<n;i++) f[i]=find(i);
68 for(int i=0;i<v.size();i++){
69 int x=f[v[i].x],y=f[v[i].y];
70 if(v[i].s=='>'&&
71 find(G[x].begin(),G[x].end(),y)==G[x].end())
72 G[x].push_back(y),into[y]++;
73 if(v[i].s=='<'&&
74 find(G[y].begin(),G[y].end(),x)==G[y].end())
75 G[y].push_back(x),into[x]++;
76 }
77 TopologicalSort();
78 if(ans==0) printf("OK\n");
79 if(ans==1) printf("UNCERTAIN\n");
80 if(ans==2) printf("CONFLICT\n");
81 }
82 }



posted @ 2012-03-10 14:03  HaoHua_Lee  阅读(99)  评论(0编辑  收藏  举报