您的位置:首页 > 其它

hdu 1811 Rank of Tetris

2013-11-15 10:19 381 查看
这题的关键点就是对 “=” 的处理,这个要用到并查集。把是“=”关系的点放在统一集合内,处理其中每一个点时都当做处理根结点。

数据不全的情况是同时出现两个点的入度为0,(当两个点具有“ = ”关系时,我们默认是一个点)。

#include<iostream>
#include<vector>
#include<queue>
#include<stdio.h>
#include<cstring>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn],from[maxn],pa[maxn],sum,n,m;
queue<int>q;
char c[maxn];
vector<int>map[maxn];
bool uncertain;
int find(int a){
if(pa[a] == a)return a;
return pa[a] = find(pa[a]);
}

int link(int a,int b){
a = find(a);
b = find(b); //没写这个就re了
if(a==b)return 0;
pa[b]=a;
return 1;

}

void topo(){

for(int i=0;i<n;i++)
if(from[i]==0&&find(i)==i){
q.push(i);
}
while(!q.empty()){
if(q.size()>1) uncertain=true;
int temp=q.front();
q.pop();
sum--;
for(int i=0;i<map[temp].size();i++)
{
if(--from[map[temp][i]]==0){
q.push(map[temp][i]);
}
}
}

}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
uncertain=false;
sum=n;
memset(from,0,sizeof(from));
for(int i=0;i<n;i++){
pa[i]=i;
map[i].clear();
}

for(int i=0;i<m;i++){
scanf("%d %c %d",&a[i],&c[i],&b[i]);
if(c[i]=='=') { //对“=”预处理
if(link(a[i],b[i]))
sum--;
}
}
for(int i=0;i<m;i++){
int x=find(a[i]);
int y=find(b[i]);
if(c[i]=='=') continue;
if(c[i]=='>') {
map[x].push_back(y);
from[y]++;

}
if(c[i]=='<'){
map[y].push_back(x);
from[x]++;

}
}
topo();
if(sum>0)printf("CONFLICT\n");
else if(uncertain) printf("UNCERTAIN\n");
else printf("OK\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: