优先队列 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("\n");
    }
    else printf("No Answer!\n");
    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\n",ans.size());
    //printf("%d\n",ss.size());
    if(ans.size()==ss.size()){
        for(int i=0;i<ss.size();i++){
            printf("%c",ans[i]+'A');
        }
        printf("\n");
    }else{
        printf("No Answer!\n");
    }
    return 0;
}

 

posted @ 2019-10-12 19:29  jhjdsdsgd  阅读(220)  评论(0编辑  收藏  举报