「HNOI2015」菜肴制作

该博客主要解析了HNOI2015中的一道菜肴制作题目,讨论了如何通过构建反图并寻找字典序最大的拓扑序来解决这个问题。博主解释了为何采取反向思维的原因,并给出了代码实现。
摘要由CSDN通过智能技术生成

 题目链接

Solution:

        首先要注意的是,本题并不是找出字典序最小的拓扑序,但我们可以反过来考虑。

        建出原图的反图,即对于每一对限制x,y,连接y->x。然后跑出反图上字典序最大的拓扑序,再将得到的拓扑序反过来即是所求。

        这样做为什么是对的呢?抽象一下题目的条件,要求是对于每一个点,拓扑序中能在它后面的一定要在它之后,那么照这个贪心策略,答案序列中的最后一个一定是可行的最大值,在这一步的基础上以此类推,便形成了反图中字典序最大的拓扑序,也正是答案序列反过来。

Code:

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
	char c=getchar();num=0;T f=1;
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
	num*=f;
}
template<typename T> void qwq(T x){
	i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值