【改了一天的拓扑排序】POJ 1094——Sorting It All Out

来源:点击打开链接

不知道怎么回事,wa了整整一天。。在绝望的时候AC了。

重点是分步处理和三种情况的判断。

1、判断是否成环,成环了直接输出错误信息。

2、然后一条边一条边的加入,进行拓扑排序,如果出度为0的点多于两个,继续判断之,如果到所有点都加入了但仍然没有判断出来,输出第三种情况。

3、以上两种情况都不存在,输出拓扑排序的路径信息。

 

#include <iostream>

#include <cstring>

#include <string>

using namespace std;



int mat[105][105];

int ans[105];

int indegree[105];

int length,rela,tflag,loopflag;





int TopoLogic()

{

    int loopcount=0;//0入度数统计

    int entrypoint=0;//第几个检测到0入度,加入队列

    int t=0;

    int flag=1;



    memset(indegree,0,sizeof(indegree));

    

    for (int a=0;a<length;a++)  //求目前图的入度

    {

        for (int b=0;b<length;b++)

        {

            if (mat[a][b])

                indegree[b]++;

        }

    }

    for (int i=0;i<length;i++)

    {

        loopcount=0;

        for (int j=0;j<length;j++)

        {

            if (indegree[j]==0)

            {

                loopcount++;

                entrypoint=j;

            }

        }

		if (loopcount>1)

            flag=-1;    //出现多种情况,不好说

        if (loopcount==0 && loopcount!=length)//第二个条件很容易忘

            return 0;

        

        ans[t++]=entrypoint;

        indegree[entrypoint]=-1;//去点

        for (int p=0;p<length;p++)

        {

            if (mat[entrypoint][p]==1)

                indegree[p]--;

        }



    }

    return flag;



}



int main()

{



    while (cin>>length>>rela)

    {

        if (length==0 && rela==0)

            break;

        memset(mat,0,sizeof(mat));

        memset(indegree,0,sizeof(indegree));



        tflag=0;//队列标志

        string tar;

        

        

        for (int t=1;t<=rela;t++)

        {

            int resulter;

            cin>>tar;

            mat[tar[0]-'A'][tar[2]-'A']=1;

            memset(ans,0,sizeof(ans));

            if (tflag==0)

            {

                resulter=TopoLogic();

                //cout<<resulter<<endl;

            }



            if (resulter==1 && tflag==0)

            {

                cout<<"Sorted sequence determined after "<<t<<" relations: ";

                for (int a=0;a<length;a++)

                    cout<<(char)(ans[a]+'A');

                cout<<"."<<endl;

                tflag=1;

            }

            

            if(resulter==0 && tflag==0)

            {

            	cout<<"Inconsistency found after "<<t<<" relations."<<endl;

            	tflag=1;

            }



        }

        if(tflag==0)

            cout<<"Sorted sequence cannot be determined."<<endl;   //全部判断完再输出矛盾!! 

       

    }

     return 0;

}


 

 

你可能感兴趣的:(sort)