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

来源:互联网 发布:苏州网络推广公司 编辑:程序博客网 时间:2024/04/19 12:59

来源:点击打开链接

不知道怎么回事,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;}


原创粉丝点击