优先队列 stl 拓扑排序

Posted qqshiacm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优先队列 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;
}

 

以上是关于优先队列 stl 拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5638 拓扑排序+优先队列

HDU-4857-逃生-反向拓扑排序+优先队列

HDU 4857 逃生(反向拓扑排序+优先队列)

HDU_1285_拓扑排序(优先队列)

为啥 STL 优先级队列错误地对我的类对象进行排序

AtCoderD - Restricted Permutation 拓扑排序模板题:拓扑排序+优先队列