这题写了几天了,好几次写了一半又删了的,发现拓扑还是用queue好啊
1.3种结果的优先关系conflict>uncertain>ok,只要是conflict就不是看后两者了,如果不是只有判了是uncertain就不看是否ok了,用solve()函数返回结果的情况
2.q.size()>1,同时多个点入度为0,uncertain.(要=判断了conflict才确定) 入q次数与n'不等则conflict.
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int nsize=10010,msize=20010;
vector<int>v[nsize];
int in[nsize],p[nsize],s[msize],e[msize];
char op[msize];
void init(){for(int i=0;i<nsize;i++)in[i]=0,p[i]=i,v[i].clear();}
int find(int x){return x==p[x]?x:p[x]=find(p[x]);}
int topo(int n,int num){
queue<int>q;
int ans=0;//ok
for(int i=0;i<n;i++)
if(find(i)==i&&in[i]==0) q.push(i);
while(!q.empty()){
if(q.size()>1) ans=1;//uncertain
int cur=q.front();q.pop();num--;
for(int i=0;i<v[cur].size();i++)
if(--in[v[cur][i]]==0) q.push(v[cur][i]);
}
if(num>1) ans=2;//conflict
return ans;
}
int solve(int n,int m)
{
int num=n;init();
for(int i=0;i<m;i++){
cin>>s[i]>>op[i]>>e[i];
if(op[i]=='='){
int x=find(s[i]),y=find(e[i]);
if(x!=y) p[x]=y,num--;
}
}
for(int i=0;i<m;i++){
if(op[i]=='=') continue;
int x=find(s[i]),y=find(e[i]);
if(x==y) return 2;
if(op[i]=='>') swap(x,y);
if(find(v[y].begin(),v[y].end(),x)==v[y].end())
v[y].push_back(x),in[x]++;
}
return topo(n, num);
}
int main()
{
int n,m;cin.sync_with_stdio(false);
while(cin>>n>>m){
int flag=solve(n,m);
if(flag==0)cout<<"OK"<<endl;
if(flag==1)cout<<"UNCERTAIN"<<endl;
if(flag==2)cout<<"CONFLICT"<<endl;
}
return 0;
}