首页 > 其他分享 > CF1765H Hospital Queue

CF1765H Hospital Queue

时间:2023-11-12 21:55:49浏览次数:35  
标签:std int Hospital CF1765H back Queue 2005 拓扑

题意

给定一张有向无环图,一个合法方案定以为每个点拓扑序满足对应限制,求每个点所有合法方案中的最小拓扑序。

\(1 \leq n, m \le 2000\) ,数据保证存在合法方案。

solution:

对拓扑序的字典序的限制可以用优先队列维护,这道题也可以直接开桶。倒着考虑每个时刻能让那些点成为答案,当答案候选序列为空,这个时候就只能选 i ,总之就是尽量把当前枚举的 i 往后放。只有时刻不大于一个位置的限制时,把这个点加入答案的候选序列。

#include <bits/stdc++.h>
using i64 = long long;
#define fi first
#define se second
int n, m, a[2005], deg[2005];
std::vector<int> g[2005], buc[2005];
int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cin >> n >> m;
	for (int i = 1; i <= n; ++i) std::cin >> a[i];
	for (int i = 1; i <= m; ++i) {
		int x, y;
		std::cin >> x >> y;
		g[y].emplace_back(x);
	}
	for (int s = 1; s <= n; ++s) {
		memset(deg, 0, sizeof(deg));
		for (int i = 1; i <= n; ++i) {
			for (int v : g[i]) deg[v]++;
		}
		for (int i = 1; i <= n; ++i) buc[i].clear();
		std::vector<int> vec;
		for (int i = 1; i <= n; ++i) {
			if (!deg[i] && i != s) buc[a[i]].push_back(i);
		}
		for (int tim = n; tim; --tim)  {
			for (int x : buc[tim]) vec.push_back(x);
			if (vec.empty()) {
				std::cout << tim << ' ';
				break;
			}
			int u = vec.back();
			vec.pop_back();
			for (int v : g[u]) {
				if (!--deg[v] && v != s) {
					if (a[v] >= tim) vec.push_back(v);
					else buc[a[v]].push_back(v);
				}
			}
		}
	}
	return 0;
}

标签:std,int,Hospital,CF1765H,back,Queue,2005,拓扑
From: https://www.cnblogs.com/zhangwenyang/p/17827952.html

相关文章

  • 20231110_stack_queue
    课程笔记https://www.cnblogs.com/hellohebin/p/15677386.html上课代码//1-10/*//test1#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intsta[N],head=0;intn,x;intmain(){cin>>n;for(inti=1;i<=n;i++){ci......
  • BlockingQueue队列详解
    /**本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被......
  • .NET(C#) LinkedList、Queue<T>和Stack<T>的使用
    本文主要介绍.NET(C#)中,LinkedList链表、Queue<T>队列和Stack<T>堆栈的使用,以及相关的示例代码。1、LinkedList(链表)链表中元素存储内存中是不连续分配,每个元素都有记录前后节点,节点值可以重复,不能通过下标访问,泛型的使用保证类型安全,可以避免装箱拆箱,找元素就只能遍历,查找不方......
  • 队列(Queue):先进先出(FIFO)的数据结构
    队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(FirstIn,FirstOut,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服务的人。在本篇博客中,我们将详细介绍队列的概念、用途、实现以及如何在编程中......
  • Java拾贝第十六天——集合之Queue、Stack
    Queue(队列)Queue是一种先进先出(FIFO:FirstInFirstOut)的有序集合:Queue是Collection的子接口,其定义如下publicinterfaceQueue<E>extendsCollection<E>LinkedList实现了Queue的子接口,根据多态性可以使用Queue创建LinkedList实例。Queue接口常用方法如下:方法类型......
  • Princeton Algorithms, Part I week2 stack&queue
    stack:先进后出queue:先进先出首先是stack有两种实现方式,第一种是用链表,第二种是用数组。Stack:linked-listrepresentation   stack:arrayimplementation  上面这个实现是固定长度的arrayimplementation非常不方便,所以引入可变长度的实现resizing-array......
  • odoo pdf 打印任务后台运行,pdf保存在附件中, 借助queue_job模块实现后台打印
    用户故事:在打印大批量pdf文件时会有较长事件的等待,而且容易中断原因中断原因,有内存及超时限制,wkhtmltopdf工具比较吃内存解决方案:内存限制的问题可以分批处理,比如每次只处理50条记录代码示例,使用按钮触发的打印功能:#model:[email protected]......
  • BlockingQueue---SynchronousQueue
    概述A{@linkplainBlockingQueueblockingqueue}inwhicheachinsertoperationmustwaitforacorrespondingremoveoperationbyanotherthread,andviceversa.Asynchronousqueuedoesnothaveanyinternalcapacity,notevenacapacityofone.......
  • cf353D. Queue(整体考虑转移)
    D.Queuef[i]表示第i个F需要多少时间才能让所有的M都移到她后面,那么我们考虑转移,分为两种情况。第i个F和第i-1个F挨着,那么显然f[i]=f[i-1]+1假如中间隔着一些M,可以分为两种情况,假如i可以在i-1完成之前追上它,那么就是f[i-1]+1,否则就说明i一直在进行交换,时间为在i之前的M的个数......
  • C++---数据结构---队列(queue)
    queue容器queue基本概念概念:Queue是一种先进先出(FirstInFirstOut,FIFO)的数据结构,它有两个出口队列容器允许从一端新增元素,从另一端移除元素队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为—入队push队列中出数据称为—出队popque......