#include"stdio.h" #include"string.h" #include"vector" #include"queue" #include"algorithm" using namespace std; int pre[30000],degree[30000]; vector<int>vet[30000]; int sum,n,m; struct point { int x,y; char ch; }a[30000]; int find(int k) { if(k!=pre[k]) pre[k]=find(pre[k]); return pre[k]; } void Union(int x,int y) { x=find(x); y=find(y); if(x!=y) pre[y]=x; } void fun() { int i; for(i=0;i<n;i++) { pre[i]=i; degree[i]=0; vet[i].clear(); } } int top() { int i,ss=0; queue<int>q; for(i=0;i<n;i++) { if(find(i)==i&°ree[i]==0) q.push(i); } while(!q.empty()) { if(q.size()>=2) ss=-1; int x=q.front(); q.pop(); sum--; for(i=0;i<vet[x].size();i++) { if(degree[vet[x][i]]>0) degree[vet[x][i]]--; if(degree[vet[x][i]]==0) q.push(vet[x][i]); } } if(sum>=1) return 1; return ss; } int main() { int i,flag1,flag2,x,y; while(scanf("%d%d",&n,&m)!=EOF) { fun(); sum=n; flag1=0;flag2=0; for (i=0;i<m;i++) scanf("%d %c %d",&a[i].x,&a[i].ch,&a[i].y); for(i=0;i<m;i++) { if(a[i].ch=='=') { Union(a[i].x,a[i].y); sum--; } } for(i=0;i<m;i++) { if(a[i].ch=='=') continue; x=find(a[i].x); y=find(a[i].y); if(x==y) { flag1=1; } if(a[i].ch=='>') { vet[x].push_back(y); degree[y]++; } else { vet[y].push_back(x); degree[x]++; } } if(!flag1) { int tem=top(); if(tem==1) flag1=1; else if(tem==-1) flag2=1; } if(flag1==1) printf("CONFLICT\n"); else if(flag2==1) printf("UNCERTAIN\n"); else printf("OK\n"); } return 0; }
hdu 1811 拓扑排序+并查集
最新推荐文章于 2022-05-15 16:59:20 发布