HDU1811 Rank of Tetris
拓扑排序+并查集
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> g[10011];
int level[10011];
int fa[10011];
int X[20011];
int Y[20011];
int ch[20011];
int sum;
int finda(int k)
{
if(k==fa[k]) return k;
else return fa[k]=finda(fa[k]);
}
void init()
{
memset(g,0,sizeof g);
memset(level,0,sizeof level);
for(int i=0;i<n;i++) fa[i]=i;
}
void toposort()
{
queue<int>q;
for(int i=0;i<n;i++)
if(!level[i]&&finda(i)==i) q.push(i);
bool flag=false;
while(!q.empty())
{
if(q.size()>1) flag=true;
int x=q.front();q.pop();sum--;
for(int i=0;i<g[x].size();i++)
{
int y=g[x][i];
level[y]--;
if(!level[y])
q.push(y);
}
}
if(sum>0) cout<<"CONFLICT"<<endl;
else if(flag)
cout<<"UNCERTAIN"<<endl;
else
cout<<"OK"<<endl;return;
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
sum=n;
init();
for(int i=0;i<m;i++)
{
scanf("%d %c %d",&X[i],&ch[i],&Y[i]);
if(ch[i]=='=')
{
int x=finda(X[i]);int y=finda(Y[i]);
if(x!=y) fa[y]=x;
sum--;
}
}
bool pd=false;
for(int i=0;i<m;i++)
{
int x=finda(X[i]);int y=finda(Y[i]);
if(x==y&&ch[i]!='=')
{
pd=true; break;
}
if(ch[i]=='>')
{
g[x].push_back(y);
level[y]++;
}
else if(ch[i]=='<')
{
g[y].push_back(x);
level[x]++;
}
}
if(pd) cout<<"CONFLICT"<<endl;
else toposort();
}
}