版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/oidoidoid/article/details/80932640
之前写了没调,今天捏了一个小样例就过了,卒
今天苟完了粗糙的推箱子大作业,太丑陋了,但是认真敲代码的感觉真好
不能再赖床了,要认真学习
是一go并查集+拓扑排序,有俩处理:
1.等于的把他们合并在一起变成一个
2.最后拓扑排序的时候,如果队列里有大于一个元素,说明排列不唯一
#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char s[10];
int head[10005];
struct edge{
int v,next;
}e[20005];
int ind[10005],fa[10005],sum[10005];
int tot;
queue<int>q;
void addedge(int u, int v){
e[++tot]=(edge){v,head[u]};
head[u]=tot;
}
int getfa(int x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
void unit(int x, int y){
int xx=getfa(x);
int yy=getfa(y);
if (xx==yy)return;
fa[xx]=yy;
sum[yy]+=sum[xx];
for (int i=head[xx];i!=-1;i=e[i].next){
addedge(yy,getfa(e[i].v));
}
}
int main(){
int n,m,x,y;
while (~scanf("%d%d",&n,&m)){
memset(head,-1,sizeof(head));
memset(ind,0,sizeof(ind));
tot=0;
for (int i=0;i<n;i++){
fa[i]=i;
sum[i]=1;
}
for (int i=1;i<=m;i++){
cin>>x>>s>>y;
if (s[0]=='>') addedge(getfa(x),getfa(y));
else if (s[0]=='=') unit(x,y);
else addedge(getfa(y),getfa(x));
}
for (int i=0;i<n;i++){
if (fa[i]!=i) continue;
for (int j=head[i];j!=-1;j=e[j].next){
ind[getfa(e[j].v)]++;
}
}
/*
for (int i=0;i<n;i++) cout<<ind[i]<<" ";
cout<<endl;
for (int i=0;i<n;i++) cout<<fa[i]<<" ";
cout<<endl;
cout<<sum[0]<<endl;
*/
int qsum=0;
for (int i=0;i<n;i++){
if (fa[i]==i&&ind[i]==0) q.push(i);
}
int ans=0;
while(!q.empty()){
if (q.size()>1) ans=1;
int u=q.front();
//cout<<"u="<<u<<" sum="<<qsum<<endl;
q.pop();
qsum+=sum[u];
for (int i=head[u];i!=-1;i=e[i].next){
int v=getfa(e[i].v);
ind[v]--;
if (!ind[v]){
// cout<<"fa[v]="<<fa[v]<<" v="<<v<<endl;
q.push(v);
}
}
}
if (qsum<n) cout<<"CONFLICT"<<endl;
else if (ans==1) cout<<"UNCERTAIN"<<endl;
else cout<<"OK"<<endl;
}
}
/*
5 4
0 = 1
2 > 1
3 < 1
4 < 1
*/