3 3 0 > 1 1 < 2 0 > 2 4 4 1 = 2 1 > 3 2 > 0 0 > 1 3 3 1 > 0 1 > 2 2 < 1
OK CONFLICT UNCERTAIN
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int n,m,in[10010],fa[10010],cnt,u[20010],v[20010];
char c[20010];
vector <int> eg[20010];
void make_set()
{
for(int i=0;i<n;i++)
{
fa[i]=i;
eg[i].clear();
}
}
int Find(int x)
{
if(x!=fa[x])
fa[x]=Find(fa[x]);
return fa[x];
}
void Union(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
{
fa[fy]=fx;
cnt++;
}
}
void top_sort()
{
stack <int> s;
int flag=0;
for(int i=0;i<n;i++)
if(in[i]==0&&fa[i]==i)
s.push(i);
while(!s.empty())
{
if(s.size()>1)flag=1;
int u=s.top();s.pop();
cnt++;
for(int i=0;i<eg[u].size();i++)
{
int v=eg[u][i];
in[v]--;
if(in[v]==0)
s.push(v);
}
}
if(cnt<n) puts("CONFLICT");
else if(flag==1) puts("UNCERTAIN");
else puts("OK");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
make_set();
memset(in,0,sizeof(in));cnt=0;
for(int i=0;i<m;i++)
{
scanf("%d %c %d",&u[i],&c[i],&v[i]);
if(c[i]=='=')
Union(u[i],v[i]);
}
for(int i=0;i<m;i++)
{
if(c[i]=='=')continue;
int a=Find(u[i]),b=Find(v[i]);
if(c[i]=='>')
{
eg[a].push_back(b);
in[b]++;
}
else
{
eg[b].push_back(a);
in[a]++;
}
}
top_sort();
}
return 0;
}HDU 1811-Rank of Tetris(拓扑排序+并查集)
原文地址:http://blog.csdn.net/qq_16255321/article/details/39210527