• 优先队列 stl 拓扑排序


    2153: D.ly的排队问题

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 169  Solved: 73
    [Submit][Status][Web Board]

    Description

    马上要上体育课了,上体育课之前总归是要排个队的,ly作为班长,怎么排队的问题只能由她来解决,但是马上要上课了,ly又不清楚所有人的身高,她又不好意思问每个人的身高,因为这样会显的自己很不负责,于是她只能通过肉眼观察...那么问题来了,她只能观察出两个人A和B谁高谁矮,但是她没有办法排出一个序列。
    ly都已经帮你出了两次主意赢过wjw,那么现在她需要你的帮助,你可以帮她吗?
    (ly会告诉你A和B谁高,如果A比B高,会用A>B来表示)

    Input

    只有一组数据,每个比较结果占一行,读取到文件结束

    Output

    若输入数据无解,则输出"No Answer!",否则从高到低输出每个人的名字,中间没有分割符
    若有多种情况,输出字典序最小的答案

    Sample Input

    E>A A>S S>Y

    Sample Output

    EASY

    https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=2153

    #include<bits/stdc++.h>//网上大佬的代码 
    using namespace std;
    
    typedef long long LL;
    const int inf=1e9;
    const int maxn=1e6+5;
    vector<int>edge[50];
    int in[50];
    
    int main()
    {
        char s[5];
        
        set<int>k;//储存人的个数,set避免重复; 
        
        while(cin>>s)
        {
            k.insert(s[2]-'A');
            k.insert(s[0]-'A');
            
            if(s[1]=='>')
            {
                in[s[2]-'A']++;
                edge[s[0]-'A'].push_back(s[2]-'A');
            }
            else
            {
                in[s[0]-'A']++;
                edge[s[2]-'A'].push_back(s[0]-'A');
            }
        }
        
        priority_queue<int,vector<int>,greater<int> >q;//greater<int>表示左边大于右边,vector<int>为储存的方式; 
                                                       //less<int>表示右边大于左边; 
                                                       //greater表示内置类型从大到小排序,less表示内置类型从小到大排序。
                                                       //左进右出,greater表示最小值优先,less表示最大值优先; 
        for(int i=0;i<30;i++)
        {
            if(in[i]==0&&k.count(i)!=0)//set集合count()函数运用,count()返回集合中某个值元素的个数 ;
                q.push(i);//优先队列,保证是按字典序排列; 
        }
        
        vector<int>ans;
        
        while(!q.empty())
        {
            int p=q.top(); q.pop();//top就是取队首元素,pop就是队首元素出队;
            ans.push_back(p);//记录每一个点
             
            for(int i=0;i<edge[p].size();i++)
            {
                int y=edge[p][i];
                in[y]--;
                if(in[y]==0&&k.count(y)!=0)
                    q.push(y);
            }
        }
        if(ans.size()==k.size())
        {
            for(int i=0;i<ans.size();i++)
                printf("%c",ans[i]+'A');
            printf("
    ");
        }
        else printf("No Answer!
    ");
        return 0;
    }
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<set>
    #include<vector>
    #include<functional>//greater,less;
    using namespace std;
    
    const int maxn=100+3;
    char str[4];
    int in[maxn];
    set<int>ss;
    vector<int>ans;
    vector<int>edge[maxn];
    priority_queue<int,vector<int>,greater<int> >q; 
    
    int main()
    {
        while(scanf("%s",str)!=EOF){
            ss.insert(str[0]-'A');
            ss.insert(str[2]-'A');
            if(str[1]=='>'){
                edge[str[0]-'A'].push_back(str[2]-'A');
                in[str[2]-'A']++;
            }else{
                edge[str[2]-'A'].push_back(str[0]-'A');
                in[str[0]-'A']++;
            }
        }
        for(int i=0;i<100;i++){
            if(in[i]==0&&ss.count(i)!=0){
                q.push(i);
            }
        }
        while(!q.empty()){
            int u=q.top();
            q.pop();
            ans.push_back(u);
            for(int i=0;i<edge[u].size();i++){
                int v=edge[u][i];
                in[v]--;
                if(in[v]==0){
                    q.push(v);
                }
            }
        }
        //printf("%d
    ",ans.size());
        //printf("%d
    ",ss.size());
        if(ans.size()==ss.size()){
            for(int i=0;i<ss.size();i++){
                printf("%c",ans[i]+'A');
            }
            printf("
    ");
        }else{
            printf("No Answer!
    ");
        }
        return 0;
    }
  • 相关阅读:
    PythonStudy——greenlet 协程
    PythonStudy——事件 Event
    PythonStudy——单线程并发的实现
    2015年的总结
    kylin一种OLAP的实现
    分布式消息队列的使用kakfa
    第一次听到了docker
    Hive分布式的数据仓库
    dubbo服务框架学习
    Storm实时计算框架的编程模式
  • 原文地址:https://www.cnblogs.com/qqshiacm/p/11663544.html
Copyright © 2020-2023  润新知