优先队列 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;
}

原文地址:https://www.cnblogs.com/qqshiacm/p/11663544.html

时间: 2024-08-13 07:23:03

优先队列 stl 拓扑排序的相关文章

拓扑排序((算法竞赛入门经典)刘汝佳)

转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents [分析](小白) 把每一个变量看成一个点,"小于"关系看成有向边,则我们得到了一个有向图.这样,我们的任务实际上是把一个图的全部结点排序,使得每一条有向边(u,v)相应的u都排在v的前面.在图论中,这个问题称为拓扑排序. 不难发现:假设图中存在有向环,则不存在拓扑排序,反之则存在.我们把不包括有向环的有向图称为有向无环图.能够借助dfs函数完毕拓扑排序:在訪问完一个结点

拓扑排序(待更新模板)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593

hdu 4857 逆向建图+拓扑排序 ***

题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处.负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推.那么你就要安排大家的顺序.我们保证一定有解. 链接:点我 题目

HDU1285 确定比赛名次【拓扑排序】【优先队列】

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13215    Accepted Submission(s): 5291 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

hdu1285 拓扑排序+优先队列

原题地址 这算是我个人AC的第一个拓扑排序题目吧. 题目解读 给出几组比赛的胜负情况.推断最后的排名.依据题意这就是一个明显的拓扑排序问题了. 注意 假设由于可能的排名有多种情况,这时要保证编号小的在前. 题目输入的数据可能有反复边 拓扑排序 首先统计每一个结点的入度. 将度为0的结点编号放入队列(此题放入优先队列中)中. 然后进行循环: 取出队头结点,视作边的起点. 然后"删除与该点相连的边".代码就是将这个图中的该边还有一个结点(即终点)的入度减一: 假设减一以后,终点的入度变为了

hdoj 4857 逃生(逆向拓扑排序+优先队列)

逃生 点击打开链接 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2161    Accepted Submission(s): 608 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前

HDU 5638 拓扑排序+优先队列

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序的算法稍微改一下,如果某个顶点的入度小于k也把它加到优先队列里面去. k减小后队列里面会有些点不满足<=k,直接踢出来就好了. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<

POJ 3687 Labeling Balls【拓扑排序 优先队列】

题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.csdn.net/scf0920/article/details/28108243 然后用优先队列来实现的参看的这一篇 http://ycool.com/post/u9ahrwg#algo3 1 #include<iostream> 2 #include<cstdio> 3 #includ

hdu--1285 &amp;&amp; 4857 --正向 || 逆向拓扑排序 &amp;&amp; 优先队列

头太晕了 喝了太多 .. 就想提一点 对于 拓扑排序的这2题 为什么一个是正向 一个是逆向 主要是看题目要求  因为拓扑排序的结果总是有很多种存在的 一般来说 它会让你输出它指定要求的形式的答案 那么 如果是按字典序输出 就是 greater<int> 情况下的优先队列 并且 正向 如果是尽量使小的数字 靠前输出 而不是追求 字典序 可以考虑 逆向拓扑 逆向输出 但 这些都不是唯一的 一定要分析好题目 曾经 看过一个讲动态规划的word  说拓扑是为DP作准备的 似乎有点道理 这两题 代码 实