并查集的题目,再加个拓扑排序。 一开始总是wa,我那个犯2的错误:用gets读入,却忽略了如果那些数字大于9的情况。 #include<iostream> #include<queue> using namespace std; #define N 10005 #define M 20005 struct edge { int ver; edge *next; }; queue<int>que; edge *g[N]; int deg[N],set[N],tot; bool flag; char s[M]; int lef[M],rig[M]; int find(int x) { int r=x,i,j; while(r!=set[r]) r=set[r]; i=x; while(i!=r) { j=set[i]; set[i]=r; i=j; } return r; } void merge(int a,int b) { if(a>b) set[a]=b; else set[b]=a; } bool add_edge(int u,int v) { edge *ptr=g[u]; while(ptr) { if(ptr->ver==v) return false; ptr=ptr->next; } ptr=new edge; ptr->ver=v; ptr->next=g[u]; g[u]=ptr; return true; } void init(int n,int m) { int i,x,y; for(i=0;i<n;i++) { set[i]=i; g[i]=NULL; } memset(deg,0,sizeof(deg)); tot=n; flag=true; while(!que.empty()) que.pop(); for(i=0;i<m;i++) if(s[i]=='=') { x=find(lef[i]); y=find(rig[i]); if(x==y) continue; else { merge(x,y); tot--; } } for(i=0;i<m;i++) { if(s[i]=='=') continue; x=find(lef[i]); y=find(rig[i]); if(x==y) flag=false; if(s[i]=='>'&&add_edge(x,y)) deg[y]++; if(s[i]=='<'&&add_edge(y,x)) deg[x]++; } for(i=0;i<n;i++) if(deg[find(i)]==0&&find(i)==i) { que.push(find(i)); continue; } } int solve() { int temp,ans=0; if(!flag) return 0; while(!que.empty()) { if(que.size()>1) ans=1; temp=que.front(); que.pop(); tot--; for(edge *ptr=g[temp];ptr;ptr=ptr->next) if(--deg[ptr->ver]==0) que.push(ptr->ver); } if(tot>1) return 0; if(ans) return 1; else return 2; } int main() { int n,m,i,t,j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<m;i++) scanf("%d %c %d",&lef[i],&s[i],&rig[i]); init(n,m); t=solve(); if(!t) printf("CONFLICT/n"); else if(t==1) printf("UNCERTAIN/n"); else printf("OK/n"); } return 0; }