首页 > 其他分享 >P3243 菜肴制作

P3243 菜肴制作

时间:2023-07-31 19:13:05浏览次数:40  
标签:菜肴 int 拓扑 Impossible P3243 include 制作 节点

P3243 菜肴制作

题意给出由n个节点组成的有向(不一定无环)图,给出m组限制 (i,j) 代表i节点必须先于j被访问,现询问在满足所有限制的情况下,访问顺序字典序最小的一种

首先考虑 Impossible 的情况:当图出现环的时候产生矛盾,所以只要判定有没有环就好了

思路

一开始用了dfs:反向建边,从小到大遍历寻找每个点,如果目前仍有先于它的菜,继续递归至无前置节点,回溯时输出
数组记录节点出现次数,如果次数小于n个,则说明有环,输出 Impossible

但很快发现反例
(5,1)(2,4)(4,5)(3,5)

pPpOkOP.png

在这个例子里,dfs得到结果为 3 2 4 5 1, 但正确结果应该为 2 3 4 5 1
深搜只能在同一层进行决策,无法看到下一层的更优值

又看了一遍题,发现是拓扑排序

于是写了一遍拓扑交了,结果WA 9个

发现题很坑,要求序号较小的尽量在前,但不一定在前,就像上面的例子

但小的尽量在前,无论是否向前,大编号一定向后,把大编号向后放一定更优

所以想到了解法 (但还是没调出来 :

仍然反向建边,顺序后指向顺序前,在反向图上跑拓扑排序,这样求得的序列一定字典序最大

数组记录序列,最后倒序输出

  • Impossible! :拓扑过程中记录节点出现次数,次数小于n,说明存在环,不成立

  • 队列的选取 :因为在寻找过程中要不断找到最大值,所以用优先队列,priority_queue,队首为最大值

(看了看题解,发现少了一行初始化

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100009;
int t, m, n, x, y, in[N], ans[N], cnt;
vector<int> v[N];       // 建图 
priority_queue<int> q;  //大顶堆 
inline void TopoSort() {
	for (int i = 1; i <= n; i ++) 		
        if (!in[i])
            q.push(i);
	cnt = 0;
	while (!q.empty()) {
		int h = q.top();
		q.pop();
		ans[++ cnt] = h;  // 记录出队序列及元素个数 
		for (int i = 0; i < v[h].size(); i ++) {
			int l = v[h][i];
			in[l] --;
			if (!in[l])
                q.push(l);
		}
	}
}
inline void clear() {
	for (int i = 1; i <= n; i ++) 
        v[i].clear();
	memset(in, 0, sizeof in);
	memset(ans, 0, sizeof ans);
}
int main() {
	scanf("%d", &t);
	while (t --) {
		scanf("%d%d", &n, &m);
		clear();  // 需要初始化 
		while (m --) {
			scanf("%d%d", &x, &y);
			v[y].push_back(x);  // 反向建边 
			in[x] ++;  // 记录入度 
		}
		TopoSort();    // 拓扑排序 
		if (cnt < n)    
            cout << "Impossible!";    // 如果出现节点个数小于 n
		else		
            for (int i = n; i >= 1; i --)   
                cout << ans[i] << " ";	// 倒序输出
		cout << endl;
	}
	return 0;
}

标签:菜肴,int,拓扑,Impossible,P3243,include,制作,节点
From: https://www.cnblogs.com/plokmnjiu/p/17594241.html

相关文章

  • vue-scrollmagic 滚动动画制作插件
     1、需求:在做网站的时候、需要加一个根据页面滚动位置进行页面变化的效果。2、实现方案:自己写个滚动监听也不是很复杂、但是管理维护起来比较乱。所以直接找了这个插件官网:vue-scrollmagic、插件地址3、使用:安装npmivue-scrollmagic--save载入//main.jsimportV......
  • Linux18--存储管理之:MBR与GPT分区、格式化文件系统、磁盘挂载、制作swap分区、文件系
    0新增磁盘流程#磁盘整体的操作步骤1.增加磁盘编辑虚拟机设置--新增硬盘--SCSI--创建新虚拟磁盘--200G、多个文件--完成2.磁盘分区3.分区格式化成文件系统4.文件系统挂载到指定目录1磁盘分区#1分区分类主分区主引导分区,是可以安装系统的分区......
  • unity制作位图字体
    第一步:ps制作好艺术字体,每个一样宽一样高。第二步:使用 bmfont软件,将前面做好的小图转成fnt和png。(下载地址:https://www.angelcode.com/products/bmfont/)<?xmlversion="1.0"?><font><infoface="Arial"size="32"bold="0"italic="0"......
  • vue2集成simple-mind-map思维导图,实现在线制作思维导图
    1.使用组件组件源码版本licensesimple-mind-map地址0.6.6MIT@toast-ui/editor地址3.1.5MITv-viewer地址1.6.4MITxlsx地址0.18.5Apache-2.0vue-i18n地址8.27.2MIT2.组件结构(部分)3.截图4.示例项目项目一:gitee......
  • 如何制作(复刻)一张tf镜像系统卡(包括瘦身)
    无法在Windows完全做到,所以请使用Lunix系统,博主系统为Ubuntu22.04摘抄自知乎@拖拉付小司机侵删在得到img镜像文件后,不仅可以使用以上提到的linux指令方法,也可以返回Windows使用软件的界面方法:这里推荐使用Win32DiskImager_v1.0读入镜像后,选择要写入的tf卡。校验值:无;勾选“......
  • 使用vue制作一个聊天框
      使用Vue制作的简单聊天框:<template><divclass="chat-box"><divclass="message-list"><divclass="message"v-for="(message,index)inmessages":key="index"><div......
  • Linux 下的 U 盘镜像制作
    1)准备一个U盘,例如系统识别为/dev/sdb,删掉其分区(fdisk/dev/sdb,thend,thenw)2)$sudoddif=/path/to/*.isoof=/dev/sdb不过上述命令没有进度显示,干着急……3)安装pv(pipeviewer)$sudoapt-getinstallpv4)使用pv写镜像,$pv/path/to/*.iso|sudoddof=/dev/s......
  • 洛谷 P3243 [HNOI2015] 菜肴制作 - toposort 需自己理解翻译题面
    P3243[HNOI2015]菜肴制作题目描述知名美食家小A被邀请至ATM大酒店,为其品评菜肴。ATM酒店为小A准备了\(n\)道菜肴,酒店按照为菜肴预估的质量从高到低给予\(1\)到\(n\)的顺序编号,预估质量最高的菜肴编号为\(1\)。由于菜肴之间口味搭配的问题,某些菜肴必须在另一些......
  • DaVinci Resolve Studio 18.5 (macOS, Windows) - 剪辑、调色、特效和音频后期制作
    DaVinciResolveStudio18.5(macOS,Windows)-剪辑、调色、特效和音频后期制作BlackmagicDesignDaVinciResolveStudio18.5请访问原文链接:https://sysin.org/blog/davinci-resolve-18/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDaVinciResolve18免费......
  • Sticker Magic - 一款神奇的数字贴纸制作应用
    StickerMagic是一款借助人工智能技术,让您在几秒钟内轻松制作数字贴纸的神奇应用。StickerMagic的主要功能使用人工智能技术,只需上传一张图片或者语言描述,就可以在几秒内自动生成多种风格的数字贴纸支持上传JPEG、PNG等常见图片格式图片主体会自动抠图,提取出清晰边缘......