• POJ1094Sorting It All Out


    分析:这题需要考虑的方面比较多

    需要考虑到环,唯一的拓扑序列,不唯一的拓扑序列,还需要输出在第几组数据之后知道有环或唯一的拓扑序列,并且输出唯一的拓扑序列

    因此需要对每组数据的输入进行拓扑序列

    View Code
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define MAXN 30
    using namespace std;
    int n,m;
    int degree[MAXN],temp[MAXN];
    int q[MAXN];int iq;
    struct eee{
        int v,next;
    }edge[MAXN*MAXN];
    int e,first[MAXN];
    void add(int u,int v){
        edge[e].v=v;
        edge[e].next=first[u];
        first[u]=e++;
    }
    void init(){
        memset(first,-1,sizeof(first));
        memset(degree,0,sizeof(degree));
        e=0;
    }
    //拓扑排序
    int toposort(){
        int mult=0;
        iq=0;
          for(int i=0;i<n;i++){
          temp[i]=degree[i];
        }
        for(int i=0;i<n;i++){
            if(temp[i]==0){
                q[iq++]=i;
            }
        }
        if(iq>1)mult=1;
        for(int i=0;i<iq;i++){
            int u=q[i];
            int k=0;
            for(int j=first[u];j!=-1;j=edge[j].next){
                int v=edge[j].v;
                temp[v]--;
                if(temp[v]==0){
                    k++;
                    q[iq++]=v;
                }
            }
            if(k>1)mult=1;
        }
        if(iq!=n)return 2;
        else if(mult)return 1;
        else return 3;
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        while(~scanf("%d%d",&n,&m)){
            if(n==0&&m==0)break;
            init();
            char a[5];
             int sure=0,no=0;
            for(int i=0;i<m;i++){
                scanf("%s",a);
                degree[a[2]-'A']++;
                add(a[0]-'A',a[2]-'A');
                int result=toposort();
                //result=1表示拓扑序列不唯一,result=2表示有环,result=3表示有唯一的拓扑序列
                if(result==2&&!no&&!sure){
                    printf("Inconsistency found after %d relations.\n",i+1);
                    no=1;
                }
                if(result==3&&!sure){
                printf("Sorted sequence determined after %d relations: ",i+1);
                for(int i=0;i<n;i++){
                    printf("%c",q[i]+'A');
                }
                printf(".\n");
                sure=1;
                }
            }
            if(!no&&!sure)
            printf("Sorted sequence cannot be determined.\n");
    
        }
        return 0;
    }
  • 相关阅读:
    分组密码之DES
    QTreeWidget实现一个打包小工具
    实验吧web记录
    南邮CTF记录
    XSS学习之xss20
    安全之路的一些参考
    sqlilabs_Less2128
    sqlilabs_Less110
    BUGKU练习
    看了几天的EXTJS了
  • 原文地址:https://www.cnblogs.com/arbitrary/p/2714199.html
Copyright © 2020-2023  润新知