一、题目链接

  POJ:http://poj.org/problem?id=3687

  HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1285

二、思路

  这两题题意非常相似,但是,做法却十分不同。不同的地方是,POJ题目要求按编号顺序输出排名,在答案不唯一的情况下,编号小的排名尽量靠前(即编号的更小的结点的排名优先输出);HDU题目要求按排名顺序输出编号,在答案不唯一的情况下(排名相同的情况下),编号小的尽量靠前。这两个不同的输出感觉是一个意思。但是,做法却不相同。实际上,这两题的共同点就是,在答案不唯一的情况下,输出字典序最小的。

  做法上,POJ题目是反向建边+编号大根堆。优先取入度为0的编号大的点,以保证编号小的顶点排名尽可能小。而HDU是正向建边+编号小根堆。

三、注意事项

  输入时,写成

while(~scanf("%d%d", &n, &m))//即while(scanf("%d%d", &n, &m) != EOF)

  这样写,就要记得做初始化(容器clear, pop, 数组memset)操作,但是保险。但是,也不是绝对的。如果发生超时的时候,可尝试修改这个地方为如下代码,以节省初始化产生的耗时(因为数组、容器什么的一般都写成全局变量):


scanf("%d%d", &n, &m); //只读一个样例

四、源代码

  POJ3687

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int n, m;
vector<];
priority_queue<int> que;
], deg[];

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif // ONLINE_JUDGE
    int T, a, b;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &m);
        memset(deg, , sizeof(deg));
        ; i <= n; ++i)G[i].clear();
        while(!que.empty())que.pop();
        ; j <= m; ++j) {
            scanf("%d%d", &a, &b);
            if(find(G[b].begin(), G[b].end(), a) == G[b].end()) {
                G[b].push_back(a);
                deg[a]++;
            }
        }

        ; i <= n; ++i) {
            )que.push(i);
        }
        int idx = n;
        while(!que.empty()) {
            int top = que.top();
            que.pop();
            ans[top] = idx--;
            ; i < G[top].size(); ++i) {
                int to = G[top][i];
                deg[to]--;
                )que.push(to);
            }
        }
        )puts("-1");
        ; i <= n; ++i)
            printf("%d%c", ans[i], i == n ? '\n' : ' ');

    }
    ;
}

  HDU1285

#include<bits/stdc++.h>
using namespace std;
];
vector<], ans;
priority_queue<int, vector<int>, greater<int> > que;
int main() {
    int a, b;
    while(~scanf("%d%d", &n, &m)) {
        memset(deg, , sizeof(deg));
        ; i < ; ++i)G[i].clear();
        while(!que.empty())que.pop();
        ans.clear();

        ; i <= m; ++i) {
            scanf("%d%d", &a, &b);
            if(find(G[a].begin(), G[a].end(), b) == G[a].end()) {
                G[a].push_back(b);
                deg[b]++;
            }
        }
        ; i <= n; ++i) {
            )que.push(i);
        }
        while(!que.empty()) {
            int top = que.top();
            que.pop();
            ans.push_back(top);
            ; i < G[top].size(); ++i) {
                int to = G[top][i];
                deg[to]--;
                )que.push(to);
            }
        }
        ;i < ans.size();++i)printf( ? '\n':' ');
    }
    ;
}

两个很经典的拓扑排序题目POJ3687+HDU1285的更多相关文章

  1. 经典问题----拓扑排序(HDU2647)

    题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...

  2. ACM/ICPC 之 拓扑排序-反向(POJ3687)

    难点依旧是题意....需要反向构图+去重+看题 POJ3687-Labeling Balls 题意:1-N编号的球,输出满足给定约束的按原编号排列的重量序列,如果有多组答案,则输出编号最小的Ball重 ...

  3. Frame Stacking(拓扑排序)

    题目链接:http://acm.tju.edu.cn/toj/showp1076.html1076.   Frame Stacking Time Limit: 1.0 Seconds   Memory ...

  4. 【拓扑排序】威虎山上的分配-C++

    威虎山上的分配 描述 每年过年的时候,座山雕都会给兄弟们分银子,分银子之前,座山雕允许大伙儿发表意见,因为要是没法满足所有人的意见,指不定谁要搞出什么大新闻.不过每个人在提意见的时候只能说:" ...

  5. Codeforces Gym-102219 2019 ICPC Malaysia National J. Kitchen Plates (暴力,拓扑排序)

    题意:给你5个\(A,B,C,D,E\)大小关系式,升序输出它们,如果所给的大小矛盾,输出\(impossible\). 题意:当时第一眼想到的就是连边然后排序,很明显是拓扑排序(然而我不会qwq,之 ...

  6. Queue 应用——拓扑排序

    1. 拓扑排序 题目描述:对一个有向无环图(Directed Acyclic Graph, DAG)G进行拓扑排序,是将G中所有顶点排成线性序列,是的图中任意一堆顶点u和v,若边(u, v)在E(G) ...

  7. UVa 10305 (拓扑排序) Ordering Tasks

    题意: 经典的拓扑排序.有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列. 分析: 拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系.我们将“小于”这种关系看做一条有向 ...

  8. 【BZOJ4010】【HNOI2015】菜肴制作(拓扑排序)

    [BZOJ4010][HNOI2015]菜肴制作(拓扑排序) 题面 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为 ...

  9. 【noip模拟赛4】找啊找啊找BF 拓扑排序

    描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...

随机推荐

  1. BZOJ 2806 【CTSC2012】 Cheat

    题目链接:Cheat 话说这道题很久以前某人就给我们考过,直到现在,我终于把这个坑填上了…… 这道题要我们把一个串\(S\)划分成若干块,每块长度不小于\(L_0\),使得能够在文章库中完全匹配的块的 ...

  2. Qt570_CentOS64x64_02

    1.Qt570的简单测试项目,在做"重新构建"的操作的时候,出现1个问题,Qt底下的"编译输出"窗口中的信息为: cc1plus: error: unrecog ...

  3. Spring中的@Transactional

    spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题. 一般使用是通过如下代码对方法或接口或类注释: @Transactiona ...

  4. php--------网页开发实现微信JS的(定位,地图显示,照片选择功能)

    今天说说微信网页开发中一下JS的功能,分享一下,希望对各位有所帮助. 前提:要有公众号,和通过微信认证,绑定域名,得到相应信息,appid,appsecret等. 微信开发文档:https://mp. ...

  5. PHP------数组和对象相互转化,stdClass Object转array

    数组转JSON PHP json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE . JSON转数组 PHP json_decode() ...

  6. Zabbix SNMP OID discovery,自动发现

    Unlike file system and network interface discovery, the item does not necessarily have to have “snmp ...

  7. js作用域相关知识总结

    以前总是搞不清楚js里面的作用域.块级作用域.预解析,做题总做错,今天彻底搞明白了,来记录梳理一下~ 块级作用域 在其他语言中,任何一对花括号中的语句都属于一个块儿,在这之中定义的所有变量在代码块外都 ...

  8. powerdesigner安装图解

  9. 哈理工OJ 1328

    感觉其实可以不水的. //好像是一道特别水的小学数学题.但是我确实看了很久有试了几个样例才懂得.T_T // 先判断是不是素数.如果是素数的话.An-1一定不等于An.否则的话. // 继续找如果有一 ...

  10. 用django发送异步邮件

    太阳底下没有新鲜事,github是一个神奇的地方,你有什么想法,需求,点子.其实别人早就想到,而且也已经做到. 所以不要高估自己,有什么想法还是GITHUB一下,免得成了井底之娃. 这几天一直在研究p ...