标签:
输入中有等效的点,所以要将他们全部删除。所以只有在所以数据全部输入完成后才可以建边的关系。
输出有三种可能,分别对应下面三种情况。
- 成功
- 成环,就是最后点的个数小于输入的点的个数,这个是信息冲突的原因
- 同时有两个点入度为零进入队列,信息不完全
#include "stdio.h"
#include "string.h"
#include "stack"
#include "queue"
#include "vector"
#include "algorithm"
using namespace std;
const int N=10000+5;
int n,m,bin[N],in[N];
vector<int>t[N];
queue<int>q;
int Find(int x)
{
if(bin[x]==x) return x;
else return Find(bin[x]);
}
int main()
{
int i,j,f,a[N],b[N],cnt,fa,fb,k;
char s[N][5];
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
{
bin[i]=i;
in[i]=0;
t[i].clear();
}
memset(s,0,sizeof(s));
while(!q.empty()) q.pop();
cnt=0;
f=1;
for(i=0;i<m;i++)
{
scanf("%d %s %d",&a[i],s[i],&b[i]);
if(s[i][0]==‘=‘)
{
fa=Find(a[i]);
fb=Find(b[i]);
if(fa!=fb)
bin[fa]=fb;
cnt++;
}
}
for(i=0;i<m;i++)
{
if(strcmp(s[i],"=")==0) continue;
else if(strcmp(s[i],">")==0)
{
fa=Find(a[i]);
fb=Find(b[i]);
if(fa==fb) {f=0; break;}
t[fa].push_back(fb);
in[fb]++;
}
else if(strcmp(s[i],"<")==0)
{
fa=Find(a[i]);
fb=Find(b[i]);
if(fa==fb) {f=0; break;}
t[fb].push_back(fa);
in[fa]++;
}
}
if(f==0) {printf("CONFLICT\n");continue;}
for(i=0;i<n;i++)
{
if(in[i]==0&&Find(i)==i)
{
q.push(i);
cnt++;
}
}
while(!q.empty())
{
if(q.size()>=2) f=0;
k=q.front();
q.pop();
for(i=0;i<t[k].size();i++)
{
in[t[k][i]]--;
if(in[t[k][i]]==0)
{
q.push(t[k][i]);
cnt++;
}
}
}
if(cnt<n) printf("CONFLICT\n");
else if(f==0) printf("UNCERTAIN\n");
else printf("OK\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 1811 Rank of Tetris 拓扑排序+并查集
标签:
原文地址:http://blog.csdn.net/xinag578/article/details/47207817