B4010 菜肴制作 拓扑排序(附随机跳题代码)
今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了!
做得比较顺利,做完之后美滋滋,突然发现样例第三组过不了。。。然后发现自己算法有问题。。。GG,又想了一个超复杂的算法,刚开始写就放弃了,根本没法写。
于是看题解(本来以为自己能A),就看了一行就明白了,只要倒着存边再倒着输出就行了!!!QAQ!!
跳题代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int main()
{
int m,d;
time_t t;
read(m);read(d);
srand((unsigned int)time(NULL));
int f = m * d * rand() % ;
if(f > )
printf("%d\n",f);
else
printf("%d\n",f + );
return ;
}
题干:
Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予
1到N的顺序编号,预估质量最高的菜肴编号为1。由于菜肴之间口味搭配的问题,
某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’
先于 j 号菜肴制作”的限制,我们将这样的限制简写为<i,j>。现在,酒店希望能求
出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:也就是说,
()在满足所有限制的前提下, 号菜肴“尽量”优先制作;()在满足所有限制,
号菜肴“尽量”优先制作的前提下,2号菜肴“尽量”优先制作;()在满足所有限
制,1号和2号菜肴“尽量”优先的前提下,3号菜肴“尽量”优先制作;()在满
足所有限制, 号和 号和 号菜肴“尽量”优先的前提下, 号菜肴“尽量”优
先制作;()以此类推。
例1:共4 道菜肴,两条限制<,>、<,>,那么制作顺序是 ,,,。例2:共
5道菜肴,两条限制<,>、 <,>,那么制作顺序是 ,,,,。例1里,首先考虑 ,
因为有限制<,>和<,>,所以只有制作完 和 后才能制作 ,而根据(), 号
又应“尽量”比 号优先,所以当前可确定前三道菜的制作顺序是 ,,;接下来
考虑2,确定最终的制作顺序是 ,,,。例 2里,首先制作 1是不违背限制的;接
下来考虑 时有<,>的限制,所以接下来先制作 再制作 ;接下来考虑 时有
<,>的限制,所以接下来先制作 4再制作 ,从而最终的顺序是 ,,,,。
现在你需要求出这个最优的菜肴制作顺序。无解输出“Impossible!” (不含引号,
首字母大写,其余字母小写)
Input 第一行是一个正整数D,表示数据组数。
接下来是D组数据。
对于每组数据:
第一行两个用空格分开的正整数N和M,分别表示菜肴数目和制作顺序限
制的条目数。
接下来M行,每行两个正整数x,y,表示“x号菜肴必须先于y号菜肴制作”
的限制。(注意:M条限制中可能存在完全相同的限制)
Output 输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
者”Impossible!”表示无解(不含引号)。
Sample Input Sample Output Impossible!
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int len = ,ru[],chu[],lst[];
int n,m,k,x,y,w,ans[],num = ;
priority_queue <int> qu;
//vector <int> ve[100010];
bool vis[];
struct node
{
int l,r,nxt;
}a[];
void add(int l,int r)
{
a[++len].l = l;
a[len].r = r;
a[len].nxt = lst[l];
lst[l] = len;
chu[l]++;
ru[r]++;
}
void clean_queue()
{
priority_queue <int> p;
swap(p,qu);
}
int ok = ,emm = ;
int main()
{
read(k);
while(k--)
{
clean(vis);
clean(lst);
clean(ru);
clean(chu);
clean(ans);
clean_queue();
len = ;
ok = ;
emm = ;
num = ;
read(n);read(m);
duke(i,,m)
{
read(x);read(y);
add(y,x);
}
duke(i,,n)
{
if(ru[i] == )
qu.push(i),emm = ;
}
if(emm != )
{
printf("Impossible!\n");
continue;
}
while(!qu.empty())
{
x = qu.top();
qu.pop();
vis[x] = ;
for(int p = lst[x];p;p = a[p].nxt)
{
int r = a[p].r;
ru[r]--;
if(ru[r] == )
qu.push(r);
}
ans[++num] = x;
}
if(ans[n] != )
{
lv(i,n,)
printf("%d ",ans[i]);
printf("\n");
}
else
{
printf("Impossible!\n");
continue;
}
}
return ;
}
/*
3
5 4
5 4
5 3
4 2
3 2
3 3
1 2
2 3
3 1
5 2
5 2
4 3
*/
B4010 菜肴制作 拓扑排序(附随机跳题代码)的更多相关文章
- 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆
题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...
- 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序
[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...
- BZOJ4010[HNOI2015]菜肴制作——拓扑排序+堆
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴 ...
- [LOJ2114][HNOI2015]-菜肴制作-拓扑排序+贪心
<题面> 一个蒟蒻的痛苦一天 在今天的节目集训中,麦蒙将带领大家学习9种错误的解题策略 $15\%$算法(看两个就往下走吧) 1> puts("Impossible!&qu ...
- 【HNOI2015】菜肴制作 - 拓扑排序+贪心
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
- bzoj 4010: [HNOI2015]菜肴制作 拓扑排序
题目链接: 题目 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB 问题描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴 ...
- 洛谷P3243 [HNOI2015]菜肴制作 拓扑排序+贪心
正解:拓扑排序 解题报告: 传送门! 首先看到它这个约束就应该要想到拓扑排序辣QwQ 首先想到的应该是用优先队列代替队列,按照节点编号排序 然后也很容易被hack:<5,1> 正解应为5, ...
- 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序
题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...
- 【luoguP3243】[HNOI2015]菜肴制作--拓扑排序
题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1. 由于菜肴 ...
随机推荐
- Springboot使用JdbcTemplate RowMapper查询,直接返回实体列表
ManagerRowMapper.java public class ManagerRowMapper implements RowMapper<Manager>{ @Override p ...
- 【vue】vue中实现标签页
前言 tab标签页实现很多, 纯css实现, js实现等, 外加一些特殊动画. vue中实现标签页实现 keep-alive标签和is特性 vue-router中嵌套路由 is特性实现(推荐) 优点: ...
- LNOI2019 退役记
Day -4 最近这两天智商有点不在线啊..得好好调整作息了,滚粗感++ 复习模板好啊 下午睡了一觉,智商似乎回来了一丢丢,滚粗感-- Day -3 智商略有回暖,滚粗感-- 明天有模拟赛,要加油啊 ...
- C#关键字详解第四节
位 Unicode 字符 char在C#中与C语言不同,他表示的是16位无符号进制的数,在计算机中他是被用来存储字符但是他只能用来存 储一个文字,与string不同string可以存储多个文字或字符, ...
- max_element()与min_element()
#include<iostream>#include<algorithm>using namespace std;bool cmp(int i,int j){ return i ...
- SSL常用专业缩略语汇总
JKS - Java KeyStore JAVA密钥库 OCSP - Online Certificate Status Protocol证书在线状态协议. SAN - Subject Alterna ...
- 【codeforces 760D】Travel Card
[题目链接]:http://codeforces.com/contest/760/problem/D [题意] 去旅行,有3种类型的乘车票; 第一种:只能旅行一次20元 第二种:按时间计算,90分钟内 ...
- noip模拟赛 fateice-string
题目背景 Aldnoah ——火星上超古代文明留下的能量源,承认初代火星移民雷伊·雷加利亚博士(即后来的薇瑟帝国初代皇帝)为正统继承者,启动因子融入皇族的遗传因子中,只有皇族天生具有Aldnoah的启 ...
- nyoj 310二分+dinic
#include<stdio.h> #include<queue> #include<string.h> using namespace std; #define ...
- 认识GIT之入门
前言 GIT是非常优秀的源代码版本管理工具,经过几年的发展,已经变得非常成熟以及流行,不同于其他的源代码管理系统,值得使用.GIT官网下载在线安装包,经常会中途退出,很有可能的原因是被墙了,所以建议使 ...