• 拓扑排序-Kitchen Plates


    J. Kitchen Plates
    time limit per test1 second
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output

    You are given 5 different sizes of kitchen plates. Each plate is marked with a letter A, B, C, D, or E. You are given 5 statements comparing two different plates, you need to rearrange the plates from smallest size to biggest size. For example: the sizes of these plates.
    在这里插入图片描述

    Input
    The input consist of 5 lines. In each line there will be 3 characters, the first and last character will be either A, B, C, D, or E and the middle character will be either > or < describing the comparison between two plates sizes. No two plates will be equal.

    Output
    The output consist of 5 characters, the sorted order of balls from smallest to biggest plate. Otherwise, if the statements are contradicting print impossible. If there are multiple answers, print any of them.

    Examples
    input

    D>B
    A>D
    E<C
    A>B
    B>C
    

    output

    ECBDA
    

    input

    B>E
    A>B
    E>A
    C<B
    D<B
    

    output

    impossible
    

    题目的大体意思是输入五行,给出五个盘子的大小关系,然后需要输出从小到大的顺序,如果没有满足的情况,直接输出impossible

    分析:这个题关键在于能够想到将两个点之间的大小关系转换为一条有向边,然后将所有的关系看作是一个DAG图,然后进行拓扑排序 <—这是一篇比较不错的关于拓扑排序的博客

    代码没什么,还是加上吧
    Main_Code :

    priority_queue <int, vector<int>, greater<int> > xiao;
    char ans[6]={' ','A','B','C','D','E'};
    int deg[10];
    map<char ,int > mp;
    int vis[10];
    int Gra[10][10];
    vector<int> vet;
    void Top_sort(){
        for(int i=1;i<=5;i++){
            if(deg[i]==0) xiao.push(i);///度数为0的节点
        }
        while(!xiao.empty()){
            int x = xiao.top();
            xiao.pop();
            vet.push_back(x);
            for(int i=1;i<=5;i++){
                if(Gra[x][i]){
                    deg[i] --;
                    if(deg[i]==0) xiao.push(i);
                }
            }
        }
    }
    int main(){
        mp['A']=1,mp['B']=2,mp['C']=3,mp['D']=4,mp['E']=5;
        int T=5;
        for(int i=1;i<=T;i++){
            string s;cin>>s;
            char a,b,c;
            a=s[0],b=s[1],c=s[2];
            if(b == '<') swap(a,c);
            deg[mp[c]] ++;///入点度数加1
            Gra[mp[a]][mp[c]] = vis[mp[a]] = vis[mp[c]] = 1;///已经到过这个点
        }
        Top_sort();
    
        if(vet.size()==5)
        {
            for(int i=4;i>=0;i--){
                printf("%c",ans[vet[i]]);
            }
        }
        else{
            cout<<"impossible"<<endl;
        }
        return 0;
    }
    /**
    D>B
    A>D
    E<C
    A>B
    B>C
    
    **/
    
    
  • 相关阅读:
    光照模型
    多线程编程(7)Semaphore信号量
    多线程编程(3)
    Oracle SQL*plus常用的命令和函数
    经典的开发工具
    Windows 7/Vista下通过组策略禁止USB接口
    浅谈.NET下的多线程
    SQLServer和Oracle常用函数对比
    注册表操作类
    利用using和try/finally语句来清理资源
  • 原文地址:https://www.cnblogs.com/PushyTao/p/14507436.html
Copyright © 2020-2023  润新知