题意: 给出一系列的关系,有“>” "=" "<" 判断给出的关系中是不是有唯一的排序方式,如果没有判断是否有冲突或者是不确定的关系。
分析: 这题比较特殊的地方是要处理好“=”关系,把所有的“=”关系用并查集放到一个集合里即可。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) #define maxn 10005 int f[maxn]; int find(int x) { return f[x]==x?x:(f[x]=find(f[x])); } void join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { if(fx<fy) f[fy]=fx; else f[fx]=fy; } } struct node { int to,next; }e[100000]; int tot; int head[maxn]; void add(int s,int t) { e[tot].to=t; e[tot].next=head[s]; head[s]=tot++; } int ind[maxn]; int q[maxn]; int n,m; int sum; void toposort() { int front=0,rear=0; int i,f1=1; for(i=0;i<n;i++) if(ind[i]==0&&find(i)==i) q[rear++]=i; if(rear>1) f1=-1; while(front<rear) { int x=q[front++]; int tt=0; sum--; for(i=head[x];i;i=e[i].next) { int k=e[i].to; ind[k]--; if(ind[k]==0) { q[rear++]=k; tt++; } } if(tt>1) f1=-1; } if(sum>0) printf("CONFLICT\n"); else if(f1==-1) printf("UNCERTAIN\n"); else printf("OK\n"); } struct ED { int u,v; }edge[20003]; int main() { int a,b,i; char c; while(scanf("%d%d",&n,&m)!=EOF) { tot=1; clr(head); for(i=0;i<n;i++) f[i]=i; sum=n; int top=0; while(m--) { scanf("%d %c %d",&a,&c,&b); if(c=='>'){ edge[top].u=a; edge[top++].v=b; } else if(c=='<'){ edge[top].u=b; edge[top++].v=a; } else{ sum--; join(a,b); } } clr(ind); int flag=0; for(i=0;i<top;i++) { int fx=find(edge[i].u); int fy=find(edge[i].v); if(fx==fy) flag=1; add(fx,fy); ind[fy]++; } if(flag) printf("CONFLICT\n"); else toposort(); } return 0; }