《拓扑排序》hdoj 1811 拓扑排序 并查集

  1. #include"stdio.h"  
  2. #include"string.h"  
  3. #include"stdlib.h"  
  4. #include"queue"  
  5. using namespace std;  
  6. #define N 10011  
  7. #define M 20011  
  8.   
  9. int n,m;  
  10. int father[N],indegree[N],ans;  
  11. struct Eage{  
  12.     int from,to,next;  
  13. }eage[M];  
  14. int tot,head[N];  
  15. void add(int a,int b){  
  16.     eage[tot].from=a;eage[tot].to=b;eage[tot].next=head[a];head[a]=tot++;  
  17. }  
  18.   
  19. int find(int k)  
  20. {  
  21.     if(father[k]==k)    return k;  
  22.     father[k]=find(father[k]);  
  23.     return father[k];  
  24. }  
  25. void get_map()  
  26. {  
  27.     int i;  
  28.     int a[M],b[M];  
  29.     char str[M][3];  
  30.     int f1,f2;  
  31.     for(i=0;i<n;i++) father[i]=i;  
  32.     for(i=0;i<m;i++)  
  33.     {  
  34.         scanf("%d%s%d",&a[i],str[i],&b[i]);  
  35.         if(str[i][0]=='=')  
  36.         {  
  37.             f1=find(a[i]);  
  38.             f2=find(b[i]);  
  39.             father[f2]=f1;  
  40.         }  
  41.     }  
  42.     for(i=0;i<n;i++) f1=find(i);                 //如果想直接用某个点的father的话,这个不能漏掉。  
  43.     tot=0;  
  44.     memset(head,-1,sizeof(head));  
  45.     memset(indegree,0,sizeof(indegree));  
  46.     for(i=0;i<m;i++)  
  47.     {  
  48.         if(father[a[i]]==father[b[i]] && str[i][0]!='=')    {ans=1;break;}  
  49.         if(str[i][0]=='>')       {add(father[a[i]],father[b[i]]);indegree[father[b[i]]]++;}  
  50.         else if(str[i][0]=='<')  {add(father[b[i]],father[a[i]]);indegree[father[a[i]]]++;}  
  51.     }  
  52. }  
  53. int topsort()  
  54. {  
  55.     int tot2;  
  56.     int i,j,v,temp;  
  57.     int k,flag;  
  58.     queue<int>q;  
  59.     int now;  
  60.   
  61.     tot2=flag=temp=0;  
  62.     for(i=0;i<n;i++)  
  63.     {  
  64.         if(father[i]==i)  
  65.         {  
  66.             tot2++;  
  67.             if(!indegree[i])    {temp++;q.push(i);}  
  68.             if(temp>1)   flag=2;  
  69.         }  
  70.     }  
  71.   
  72.     k=0;  
  73.     while(!q.empty())  
  74.     {  
  75.         now=q.front();  
  76.         q.pop();  
  77.         k++;  
  78.         indegree[now]--;  
  79.         temp=0;  
  80.         for(j=head[now];j!=-1;j=eage[j].next)  
  81.         {  
  82.             v=eage[j].to;  
  83.             indegree[v]--;  
  84.             if(!indegree[v])    {temp++;q.push(v);}  
  85.         }  
  86.         if(temp>1)   flag=2;  
  87.     }  
  88.     if(k<tot2)   flag=1;  
  89.     return flag;  
  90. }  
  91. int main()  
  92. {  
  93.     while(scanf("%d%d",&n,&m)!=-1)  
  94.     {  
  95.         ans=0;  
  96.         get_map();  
  97.         if(!ans)        ans=topsort();  
  98.         if(!ans)        printf("OK\n");  
  99.         else if(ans==1) printf("CONFLICT\n");  
  100.         else            printf("UNCERTAIN\n");  
  101.     }  
  102.     return 0;  
  103. }  

你可能感兴趣的:(《拓扑排序》hdoj 1811 拓扑排序 并查集)