先吐槽一下这个难度吧,评的有点高了,但是希望别降,毕竟这是我能做出来的不多的紫题了(狗头)。


大家上来的第一反应应该都是啊,模板题,然后兴高采烈的打了拓补排序的板子,然后搞个小根堆,按照字典序输出就可。但是这样过不了第三组样例,为什么呢?不告诉你呢因为题目让你的仅仅是1后面快点跟2,2后面快点跟3而已,并没有让我们用字典序输出,问题lei了,如何按照题目的要求搞呢?把第三组样例推一下,可以发现\(<5,2>,<4,3>\)都是由于后面的2,3决定的,再推下其他的样例,可以发现一组关系都是根据这组关系较小的那个数字决定的,因为题目让数字小的尽量靠前,而排序不正确也就是因为在前面的那些大的数字干扰了我们去确定后面的那些小的数字,既然前面大的数字会干扰后面小的数字,那我们直接从后面的大的入手,把大的尽量靠后即可,所以直接反向建图,用大根堆维护当前入度为0的序列,最后把拓补排序反过来输出就行。而根据上面的经验,反向建图后再反向输出,加个大根堆,就是让大的尽量靠后,而前面的不会去干扰后面的,所以这样做是正确的(这个地方把它讲明白我想了好久啊,求个赞不过分吧)。

代码就简单了:

#include <bits/stdc++.h>
using namespace std;
int n , tot , T , m;
int f[100010] , ans[100010];
vector<int> e[100010];
int main(){
cin >> T;
while(T--){
cin >> n >> m;
memset(f , 0 , sizeof(f));
for(int i = 1; i <= 100000; i++) e[i].clear(); //清空
tot = 0;
for(int i = 1; i <= m; i++){
int x , y;
cin >> x >> y;
f[x]++;
e[y].push_back(x); //反向建图
}
priority_queue<int> q;
for(int i = 1; i <= n; i++)
if(!f[i]) q.push(i);
while(!q.empty()){
int x = q.top();
q.pop();
ans[++tot] = x;
for(int i = 0; i < e[x].size(); i++){
f[e[x][i]]--;
if(!f[e[x][i]]) q.push(e[x][i]);
}
e[x].clear();
}
if(tot != n){
cout << "Impossible!" << endl;
continue;
}
for(int i = n; i >= 1; i--) cout << ans[i] << " "; //反向输出
cout << endl;
}
return 0;
}

洛谷 P3243 【[HNOI2015]菜肴制作】的更多相关文章

  1. 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序

    题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...

  2. 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心

    正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...

  3. 洛谷 P3243 [HNOI2015]菜肴制作 题解

    每日一题 day60 打卡 Analysis 这道题一看就感觉是个拓扑排序,但因为按字典序最小的排序会有问题(见第三个样例)主要原因是每次选择有后效性,而从后往前就不会存在这个问题,因为每个子任务都是 ...

  4. 洛谷P3243 [HNOI2015]菜肴制作 (拓扑排序/贪心)

    这道题的贪心思路可真是很难证明啊...... 对于<i,j>的限制(i必须在j之前),容易想到topsort,每次在入度为0的点中选取最小的.但这种正向找是错误的,题目要求的是小的节点尽量 ...

  5. 洛谷3243 [HNOI2015]菜肴制作

    题目戳这里 Solution 错误的想法:正向建图,然后从入度为0的点选出最小u的开始输出,然后找出u连接的点v,并把v的度数减一,再次把入度为0的点加入小根堆,这样显然有错,因为只能局部保证最小,后 ...

  6. P3243 [HNOI2015]菜肴制作(拓扑排序)

    P3243 [HNOI2015]菜肴制作 题目误导你正着做拓扑排序,然鹅你可以手造数据推翻它.于是就只能倒着做 我们开个优先队列,每次把可填的最大的编号取出来搞,最后倒着输出拓扑序就好辣 #inclu ...

  7. P3243 [HNOI2015]菜肴制作

    传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...

  8. luogu P3243 [HNOI2015]菜肴制作

    这题一看就知道和拓扑序有关 考虑拓扑排序的时候每次取队列里最小的数进行排序 然后就\(\mathcal{GG}\)了,因为这样只能使字典序最小,而并不能保证题目中要求的每个编号的数要在满足前面数尽量在 ...

  9. Making Dishes (P3243 [HNOI2015]菜肴制作)

    Background\text{Background}Background I've got that Luogu Dialy has been \text{I've got that Luogu D ...

  10. bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

    题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...

随机推荐

  1. Java实现 LeetCode 637 二叉树的层平均值(遍历树)

    637. 二叉树的层平均值 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 示例 1: 输入: 3 / \ 9 20 / \ 15 7 输出: [3, 14.5, 11] 解释: 第0层的 ...

  2. Java实现 LeetCode 373 查找和最小的K对数字

    373. 查找和最小的K对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找 ...

  3. Java实现 蓝桥杯VIP 算法训练 sign函数

    试题 算法训练 sign函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0, ...

  4. Java实现 蓝桥杯 历届试题 最大子阵

    问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和 ...

  5. springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...

  6. 关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优化,你该了解这些

    前言 相信大部分开发人员,或多或少都看过或写过并发编程的代码.并发关键字除了Synchronized(如有不懂请移至传送门,关于Synchronized的偏向锁,轻量级锁,重量级锁,锁升级过程,自旋优 ...

  7. java之单点登录(SSO)

    单点登录(SSO):SSO是指在多个应用系统中个,用户只需要登陆一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一用户的登陆的机制. SSO的实现过程: 通过上述 ...

  8. Linux命令总结大全,包含所有linux命令

    使用说明:此文档包含所有的Linux命令,只有你想不到的没有你看不到的,此文档共计10万余字,有8400多行,预计阅读时间差不多需要3个小时左右,所以要给大家说一说如何阅读此文档 为了方便大家阅读,我 ...

  9. APP自动化1——Appium+pycharm自动化环境搭建全流程

    1. 安装python3,pycharm,可参考之前写的文档:https://www.cnblogs.com/chenweitoag/p/13154815.html 2. 准备以下必要工具: 基于wi ...

  10. .NET Framework、.NET Core 和 .NET 5+ 的产品生命周期

    本文整理记录了 .NET Framework..NET Core 和 .NET 各个版本的产品支持周期和操作系统兼容性. 早于 .NET Framework 2.0 和 .NET Core 2.1 的 ...