【改了一天的拓扑排序】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;
}


原文地址:https://www.cnblogs.com/keanuyaoo/p/3306306.html