zoukankan      html  css  js  c++  java
  • 【改了一天的拓扑排序】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;
    }


  • 相关阅读:
    1.5 判断是奇数还是偶数(比较运算符 & if...else)
    1.4计算器 (数字类型 & 算术运算符 &赋值运算符)
    1.3hello 张三(终端交互 & 字符串)
    1.2python语言环境 & python IDE(集成开发环境)搭建
    Centos 7 下安装jdk 7
    Centos 7 安装redis
    git 学习笔记
    git 基础操作
    git 获取远程分支的代码
    redis基础操作
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3306306.html
Copyright © 2011-2022 走看看