2278. 企鹅游行(最大流,拆点)

活动 - AcWing

在南极附近的某个地方,一些企鹅正站在一些浮冰上。

作为群居动物,企鹅们喜欢聚在一起,因此,它们想在同一块浮冰上会合。

企鹅们不想淋湿自己,所以它们只能利用自己有限的跳跃能力,在一块块浮冰之间跳跃移动,从而聚在一起。

但是,最近的温度很高,浮冰上也有了裂纹。

每当企鹅在一块浮冰上发力跳到另一块浮冰上时,起跳的浮冰都会遭到破坏,落点的浮冰并不会因此受到影响。

当浮冰被破坏到一定程度时,浮冰就会消失。

现在已知每块浮冰可以承受的具体起跳次数。

请帮助企鹅找出它们可以会合的所有浮冰。

1.png

上图是一个浮冰上站着 33 个企鹅的示例图。

输入格式

第一行一个整数 T,表示测试数据数量。

对于每组测试数据:

第一行包含一个整数 N 和一个浮点数 D,表示冰块的数量以及企鹅可以跳跃的最大距离。

接下来 N 行,每行包含四个整数 xi,yi,ni,mi,用来描述一块浮冰的 X 坐标、Y 坐标、该浮冰上站着的企鹅数量以及该浮冰可以承受的起跳次数。

N 块浮冰按照输入的顺序,依次编号为 0∼N−1。

输出格式

对于每组测试数据:

输出占一行,按从小到大的顺序输出所有可以用来会合的浮冰的编号。

如果无法会合,则输出 −1。

数据范围

1≤T≤100,
1≤N≤100,
0≤D≤105,
−10000≤xi,yi≤10000
0≤ni≤10
1≤mi≤200

输入样例:
2
5 3.5
1 1 1 1
2 3 0 1
3 5 1 1
5 1 1 1
5 4 0 1
3 1.1
-1 0 5 10
0 0 3 9
2 0 1 1
输出样例:
1 2 4
-1

解析: 

拆点:将限制流量的点拆成:出点,入点;两点之间用一条边连接。

这样将点的流量转换成边的流量进行控制。

建图方式:

建立一个虚拟源点 S,连向每个点的每条边的容量==点初始的企鹅数量;枚举每一个点作为汇点 T。

注意事项:

由于是枚举每个点作为汇点 T,因此我们不能在上一次的残留网络上直接跑最大流算法,必须要还原成初始的残留网络。否则,上一次的残留网络中当前的汇点 T 流出的流量将会导致当前图中的流量不守恒。

 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 210, M =20410 , INF = 0x3f3f3f3f;
int n, S, T;
double D;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];
PII p[110];
double eps = 1e-8;

void add(int a, int b, int c) {
	e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx++;
	e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx++;
}

bool check(PII a, PII b) {
	int x = a.first - b.first, y = a.second - b.second;
	return x * x + y * y <= D * D + eps;
}

bool bfs() {
	int hh = 0, tt = 0;
	memset(d, -1, sizeof d);
	q[0] = S, d[S] = 0, cur[S] = h[S];
	while (hh <= tt) {
		int t = q[hh++];
		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			if (d[j] == -1 && f[i]) {
				d[j] = d[t] + 1;
				cur[j] = h[j];
				if (j == T)return 1;
				q[++tt] = j;
			}
		}
	}
	return 0;
}

int find(int u, int limit) {
	if (u == T)return limit;
	int flow = 0;
	for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) {
		int j = e[i];
		cur[u] = i;
		if (d[j] == d[u] + 1 && f[i]) {
			int t = find(j, min(f[i], limit - flow));
			if (!t)d[j] = -1;
			f[i] -= t, f[i ^ 1] += t, flow += t;
		}
	}
	return flow;
}

int dinic() {
	int ret = 0,flow;
	while (bfs())while (flow = find(S, INF))ret += flow;
	//cout << ret << endl;
	return ret;
}

int main() {
	int cases = 0;
	cin >> cases;
	while (cases--) {
		memset(h, -1, sizeof h);
		idx = 0;
		scanf("%d%lf", &n, &D);
		S = 0;
		int tot = 0;
		for (int i = 1,a,b,c,d; i <= n; i++) {
			scanf("%d%d%d%d", &a, &b, &c, &d);
			p[i] = { a,b };
			add(S, i, c);
			add(i, i + n, d);
			tot += c;
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j < i; j++) {
				if (check(p[i], p[j])) {
					add(i + n, j, INF);
					add(j + n, i, INF);
				}
			}
		}
		int cnt = 0;
		for (int i = 1; i <= n; i++) {
			T = i;
			for (int j = 0; j < idx; j += 2) {
				f[j] += f[j ^ 1];
				f[j ^ 1] = 0;
			}
			if (dinic() == tot) {
				printf("%d ", i - 1);
				cnt++;
			}
		}
		if (!cnt)cout << -1 << endl;
		else cout << endl;
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/407831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

容器_Docker ( 06 )

容器_Docker ( 05 ) Kubernetes 资源对象管理 资源对象文件 模板与帮助信息 资源对象文件优势 命令无法实现高级复杂的功能某些资源对象使用命令无法创建方便管理 , 保存 , 追溯历史 资源对象文件太长 , 记不住怎么办 使用命令创建模板查询帮助信息查询官方手册 生成资源…

区块链游戏解说:什么是 Ultimate Champions

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Ultimate Champions Dashboard 什么是 Ultimate Champions Ultimate Champions 是一款免费的奇幻足球和篮球游戏&#xff0c;拥有官方授权的数字卡牌作为区块链上的 NFT…

go interface{} 和string的转换问题

1.遇到的问题 问题来源于,我sql模版拼接遇到的问题。 首先&#xff0c;这样是没有问题的。 var qhx interface{} "qhx"s : qhx.(string)fmt.Println(s) 但是当我在这段代码里用:1.类型断言 var sqlStr "select * from tx_user where username %s" join…

SpringBoot -【SmartInitializingSingleton】基础使用及应用场景

SmartInitializingSingleton 在继续深入探讨 SmartInitializingSingleton接口之前&#xff0c;让我们先了解一下 Spring Framework 的基本概念和背景。Spring Framework 是一个开源的 JavaEE&#xff08;Java Enterprise Edition&#xff09;全栈&#xff08;full-stack&#x…

C++面试题精选与解析

C面试题精选与解析 一、基础与语法 请问C中的指针和引用有什么区别&#xff1f; 指针是一个变量&#xff0c;存储的是另一个变量的内存地址。指针可以被重新赋值以指向另一个不同的对象。而引用是某个变量的别名&#xff0c;一旦引用被初始化为一个变量&#xff0c;就不能改变…

高级统计方法 第4次作业

作业评阅&#xff1a; 概念 2.问题 KNN分类和KNN回归都是KNN算法在不同类型数据上的应用&#xff0c;但它们之间存在明显的区别。 解决的问题类型不同&#xff1a;KNN分类适用于解决分类问题&#xff0c;而KNN回归则适用于解决回归问题。当响应变量是连续的&#xff0c;根据…

windows安装 RabbitMQ

首先打开 RabbitMQ 官网&#xff0c;点击 Get Started(开始) 点击 Download Installation(下载安装)。 这里提供了两种方式进行安装&#xff0c;我们使用第二种方法。 使用 chocolatey以管理用户身份使用官方安装程序 往下滑&#xff0c;第二种方法需要 Erlang 的依赖&#x…

UE蓝图 函数调用(CallFunction)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 文章目录 系列文章目录一、Call…

【Vuforia+Unity】AR06-空间环境识别功能(AreaTargets)

Vuforia原理:把被识别的物体转成图、立体图、柱形图,3D模型、环境模型,然后模型生成Vuforia数据库-导入Unity-参考模型位置开始摆放数字内容,然后参考模型自动隐藏-发布APP-识别生活中实物-数字内容叠加上去! 不论你是否曾有过相关经验,只要跟随本文的步骤,你就可以成功…

uni-app vue3 setup nvue中webview层级覆盖问题

核心就是这两行&#xff0c;&#x1f923;发现设置后不能点击了&#xff0c;这个玩意可能只能弹窗打开的时候动态的修改 position: static, zindex: 0onLoad(options > {loadWebview()})function loadWebview() {let pageInfo uni.getSystemInfoSync();width.value pageI…

强大到怀疑人生!AI视频生成必备的工具推荐!

刚发现的超牛逼AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频——播放量随便破百万。地址&#xff1a;跳转提示 - 3MW短网址https://3mw.cn/3ed5 这个Ai漫画推文软件的优势&#xff1a; 1、无需本地部署&#xff0c;对电脑…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

机器学习模型的过拟合与欠拟合

机器学习模型的训练过程中&#xff0c;可能会出现3种情况&#xff1a;模型欠拟合、模型正常拟合与模型过拟合。其中模型欠拟合与模型过拟合都是不好的情况。下面将会从不同的角度介绍如何判断模型属于哪种拟合情况。 &#xff08;1&#xff09;欠拟合与过拟合表现方式 欠拟合…

phtread_cancel函数用于取消线程,但不是实时的

如上图所示&#xff0c;线程函数中没有取消点&#xff08;一般是一些系统调用----man 7 pthreads查看&#xff0c;自定义函数是无效的&#xff09;&#xff0c;则使用pthread_cancle函数不生效。 解决方法&#xff1a;可以添加pthread_testcancle(); 通过pthread_join回收的…

广联达Linkworks GetAllData 信息泄露漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

MATLAB练习题:计算中国式排名

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 下表给出了两种不同的排名结果&#xff0c;成绩越高排名越靠前…

基于Springboot的校园求职招聘系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园求职招聘系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

剪辑视频调色怎么让画质变得清晰 视频剪辑调色技巧有哪些方面 剪辑视频免费的软件有哪些 会声会影调色在哪里 会声会影模板素材

视频调色的作用有很多&#xff0c;除了进行风格化剪辑以外&#xff0c;还可以让作品的画质变得清晰。通过调色来增强画面的清晰度&#xff0c;在观感上也会显得十分自然。视频调色的技巧有很多&#xff0c;并且原理大都十分简单。有关剪辑视频调色怎么让画质变得清晰&#xff0…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为&#xff1a;感知机(Neuron)的学习算法主要包括以下步骤&#xff1a;感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法&#xff0c;用于将输入…

MATLAB环境下基于NLEO的算法的脑电EEG信号自发活动瞬态检测

自发脑电信号是一种非平稳性很强的随机信号。在传统的脑电信号处理中&#xff0c;较公认的处理方法大多是建立在假设脑电图是准平稳信号的基础上&#xff0c;即认为它可以分成若干段&#xff0c;每一段的过程基本平稳&#xff0c;但段上叠加着瞬态。瞬态信号是有别于背景节率&a…