zoukankan      html  css  js  c++  java
  • POJ

    https://vjudge.net/problem/POJ-1094

    题意

    对于N个大写字母,给定它们的一些关系,要求判断出经过多少个关系之后可以确定它们的排序或者排序存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序。

    分析

    拓扑排序模板题。唯一麻烦点的是判断在第几个式子就可以确定关系。由于在题目中,每个元素的关系都是严格定义的,那么当队列中存在不止一个入度为0的顶点时,可以认为未能成功排序,即还需要更多条件。当拓扑排序算法进行完后,拓扑序列的个数不够,则认为排序出现了矛盾。

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #include<map>
    #include<set>
    #define rep(i,e) for(int i=0;i<(e);i++)
    #define rep1(i,e) for(int i=1;i<=(e);i++)
    #define repx(i,x,e) for(int i=(x);i<=(e);i++)
    #define X first
    #define Y second
    #define PB push_back
    #define MP make_pair
    #define mset(var,val) memset(var,val,sizeof(var))
    #define scd(a) scanf("%d",&a)
    #define scdd(a,b) scanf("%d%d",&a,&b)
    #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define pd(a) printf("%d
    ",a)
    #define scl(a) scanf("%lld",&a)
    #define scll(a,b) scanf("%lld%lld",&a,&b)
    #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
    #define IOS ios::sync_with_stdio(false);cin.tie(0)
    
    using namespace std;
    typedef long long ll;
    template <class T>
    void test(T a){cout<<a<<endl;}
    template <class T,class T2>
    void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
    template <class T,class T2,class T3>
    void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
    template <class T>
    inline bool scan_d(T &ret){
        char c;int sgn;
        if(c=getchar(),c==EOF) return 0;
        while(c!='-'&&(c<'0'||c>'9')) c=getchar();
        sgn=(c=='-')?-1:1;
        ret=(c=='-')?0:(c-'0');
        while(c=getchar(),c>='0'&&c<='9') ret = ret*10+(c-'0');
        ret*=sgn;
        return 1;
    }
    //const int N = 1e6+10;
    const int inf = 0x3f3f3f3f;
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    const ll mod = 1000000000;
    int T;
    void testcase(){
        printf("Case %d:",++T);
    }
    const int MAXN = 2500 ;
    const int MAXM = 110;
    const double eps = 1e-8;
    const double PI = acos(-1.0);
    
    bool g[30][30];
    int topu[30];
    int indeg[900];
    int n,m;
    int topuSort(){
        queue<int>q;
        int cnt=0;
        int in[900];
        memcpy(in,indeg,sizeof(indeg));
        for(int i=0;i<n;i++){
            if(in[i]==0){
                q.push(i);
            }
        }
        int u;
        bool zeros = false;
        while(!q.empty()){
            if(q.size()>1) zeros=true;
            u=q.front();
            q.pop();
            topu[cnt++]=u;
            for(int i=0;i<n;i++){
                if(g[u][i]){
                    in[i]--;
                    if(in[i]==0) q.push(i);
                }
            }
        }
        if(cnt!=n) return -1;
        if(zeros) return 0;
        return 1;
    }
    int main() {
    #ifdef LOCAL
        freopen("data.in","r",stdin);
    #endif // LOCAL
        while(~scanf("%d%d ",&n,&m)&&n){
            char temp[10];
            mset(g,false);
            mset(indeg,0);
            int pos;
            bool f1 = false;
            bool f2 = false;
            for(int i=0;i<m;i++){
                scanf("%s",temp);
                if(f1||f2) continue;
                int u = temp[0]-'A';
                int v = temp[2]-'A';
                if(!g[u][v]){
                    g[u][v]=true;
                    indeg[v]++;
                }
                int flag = topuSort();
                if(flag==-1){
                    f1=true;
                    pos=i+1;
                }else if(flag==1){
                    pos=i+1;
                    f2=true;
                }
            }
            if(f1){
                printf("Inconsistency found after %d relations.
    ",pos);
            }else if(f2){
                printf("Sorted sequence determined after %d relations: ",pos);
                for(int i=0;i<n;i++) printf("%c",'A'+topu[i]);
                puts(".");
            }else{
                printf("Sorted sequence cannot be determined.
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    如何下载、安装、启动WebTours
    Jmeter--录制脚本-用户参数化-添加断言
    UTF-8与GBK的区别
    日志的等级
    程序员与英语
    遇到安装app不识别的情况
    苹果手机怎么追踪定位
    如何制作微信表情
    比美图还要简单的在线photoshop
    Mac 下 搭建 svn 服务器
  • 原文地址:https://www.cnblogs.com/fht-litost/p/9244271.html
Copyright © 2011-2022 走看看