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