poj1094

拓撲排序:對每一條式子建圖,然後做一次拓撲排序,每一次操作後需要判斷是否有環,是否有序,如果無序則繼續下一個操作。拓撲操作是先建完圖後每次找入度爲零的點,然後斷掉這個點與圖內其他點相連的邊,接着繼續重複,如果找不到入度爲零的點則存在環

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <iomanip>
using namespace std;
int mapp[35][35],ru[35],q[35],cnt,tmp[35];
int n,m;
int toposort()
{
   int flag=1;
   int i,j,k,ori,sum;
   cnt=0;
   for(i=0;i<=n;i++)tmp[i]=ru[i];
   for(i=1;i<=n;i++)
   {
       sum=0;
       for(j=1;j<=n;j++)
        if(tmp[j]==0)
       {
           sum++;
           ori=j;
       }
       if(sum==0)return 0;
       if(sum>1)flag=-1;
       //cout<<sum<<' '<<flag<<endl;
       q[cnt++]=ori;
       tmp[ori]=-1;
       for(k=1;k<=n;k++)
        if(mapp[ori][k]==1)
        tmp[k]--;
   }
   return flag;
}
int main()
{
    while(cin>>n>>m)
    {
        if(n+m==0)break;
        memset(mapp,0,sizeof(mapp));
        memset(ru,0,sizeof(ru));
        bool flag=false;
       for(int i=1;i<=m;i++)
        {
            cnt=0;
           string a;
           cin>>a;
           if(flag)continue;
           int x=a[0]-'A'+1;
           int y=a[2]-'A'+1;
           mapp[x][y]=1;
           ru[y]++;
           int ans=toposort();
           if(ans==0)
           {
              printf("Inconsistency found after %d relations.\n",i);
                flag=1;
           }
           if(ans==1)
           {
                printf("Sorted sequence determined after %d relations: ",i);
               for(int j=0;j<n;j++)
               {
                   char c=q[j]+'A'-1;
                    cout<<c;
                }
                printf(".\n");
                flag=1;
           }
        }
        if(!flag)
            printf("Sorted sequence cannot be determined.\n");
        }
        return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章