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; }

 

转载于:https://www.cnblogs.com/GO-NO-1/articles/3316236.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值