zoukankan      html  css  js  c++  java
  • [POJ1094] Sorting It All Out

    link

    题目大意

    给出$m$个不等式关系,问可以从第几个开始确定所有之间的大小关系。若无解请输出是无法确定还是与已知矛盾。

    试题分析

    这题是真的是坑啊,尽然放在$floyd$传到闭包上面,还用二分,是真的强啊。

    其实一下子就会知道其实这是一道拓扑排序的题,所以当我们每次输入问一条边时,我们就去拓扑判断是否会形成环,条件是否充足,与顺序,然后就记得分类讨论即可。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    using namespace std;
    inline int read(){
        int f=1,ans=0;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();}
        return f*ans;
    }
    queue<int> que;
    int n,m,in[27],d[27][27],find1,k[27];
    char out[27];
    char str[1001];
    int topu(){
        while(!que.empty()) que.pop();
        for(int i=1;i<=27;i++) k[i]=in[i];
        for(int i=1;i<=n;i++){if(!in[i]) que.push(i);}
        int sx=0,num=0;
        while(!que.empty()){
            if(que.size()>1) sx=1;
            int xx=que.front();que.pop();
            out[++num]=xx+'A'-1;
            for(int i=1;i<=26;i++){
                if(d[xx][i]){
                    k[i]--;
                    if(k[i]==0) que.push(i);
                }
            }
        }
        if(num!=n) return 1;
        if(sx==1) return -1;
        return 0;
    }
    int query,step;
    int main(){
    //    freopen("7.in","r",stdin);
        while(1){
            memset(in,0,sizeof(in)),find1=0,query=0,step=0;
            memset(d,0,sizeof(d));
            n=read(),m=read();
            if(!n&&!m) return 0;
            for(int i=1;i<=m;i++){
                cin>>(str+1);
                int u=str[1]-'A'+1,v=str[3]-'A'+1;
                if(str[2]=='>') swap(u,v);
                if(find1||query) continue;
                if(d[v][u]){find1=1;printf("Inconsistency found after %d relations.",i);continue;}
                if(!d[u][v]){
                    d[u][v]=1;
                    in[v]++;
                }
                int pd=topu();
                if(pd==0){query=1;step=i;continue;}
                if(pd==1){printf("Inconsistency found after %d relations.",i);find1=1;continue;}
            }
            if(query&&find1==0){
                printf("Sorted sequence determined after %d relations: ",step);
                for(int i=1;i<=n;i++) cout<<out[i];
                printf(".");
            }
            if(find1==0&&query==0) printf("Sorted sequence cannot be determined.");
            printf("
    ");
        }
    }
    View Code
  • 相关阅读:
    线程池
    单例设计模式
    String,StringBuffer,StringBuilder
    马踏棋盘算法
    最短路径问题 (迪杰斯特拉算法,弗洛伊德算法)
    最小生成树 修路问题(普里姆算法,克鲁斯卡尔算法)
    贪心算法 求解集合覆盖问题
    Stream 数组转换
    unittest与pytest对比
    条件编译
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/10159519.html
Copyright © 2011-2022 走看看