当前位置: 首页 > article >正文

2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑+dfs

2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑+dfs

先放个传送门
https://codeforces.com/gym/105257/problem/C

在这里插入图片描述
————————————————————————————————————

思路

可以看到,每一个编号可能会被很多人向往,但每一个编号上的人只会向往一个座位。

再有可以发现,如果根据每个人的期望建边之后成环了,那么这个环内所有人都可以实现向往,但任何一条链从环出发或者终点到环的情况是都不可能实现的。环只能自给自足,而与环相接的链上的人必然不可能实现向往!

那么排除上面必死的链之外,还有什么链是可以实现的?不难发现,如果终点在 n+1 到 2*n 的链是都可以实现的。并且这些链之间是不会互相干扰的。

那么我们的目标就变成了:

①统计所有环的节点数

②统计终点在右半边的所有最长链长度和

详细步骤请看代码实现:

#include<bits/stdc++.h>
#include<assert.h>
using namespace std;
typedef long long ll;

const ll M = 2e5 + 20;
const ll inf = 1e9 + 5;
const ll P = 1e9 + 7;

//vector<int>g[M];
vector<int>gb[M];//反向建边

ll n;
ll a[M];

bitset<M>loop;//1表示属于环,0不属于
ll in[M];//每个节点的入度
ll ans = 0;

//dfs从终点反着找最长链
int dfs(int x)
{
	if (loop[x])//环只能自给自足
		return 0;

	int maxx = 0;
	for (auto& y : gb[x])
		maxx = max(maxx, dfs(y));
	return maxx + 1;
}

void topo()
{
	queue<int>q;

	for (int i = 1; i <= n; i++)
		if (in[i] == 0)
			q.push(i);

	while (!q.empty())
	{
		int ttt = q.front();
		q.pop();
		loop[ttt] = 0;//入度为0说明肯定不是环

		if (a[ttt] > n)//到右半边的不用管
			continue;
		if (--in[a[ttt]] == 0)//产生的新的入度为0的点加入队列
			q.push(a[ttt]);
	}
}

void solve()
{
	cin >> n;
	//先进行录入
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		gb[a[i]].push_back(i);//反向建边
		in[a[i]]++;//处理入度
	}
	for (int i = 1; i <= n; i++)
		loop[i] = 1;
	//拓扑排序来排除环以外的点
	topo();
	//在环里的每个人都可以互相交换
	for (int i = 1; i <= n; i++)
		if (loop[i])
			ans++;

	//反着找以 n+1 到 n 为终点的最长链
	for (int i = n + 1; i <= 2 * n; i++)
		ans += dfs(i) - 1;//减去多余的一个
	cout << ans << '\n';
}

int main()
{
	std::ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//cout << fixed << setprecision(4);

	int T = 1;
	//cin >> T;
	while (T--)
		solve();
	return 0;
}



http://www.kler.cn/news/319195.html

相关文章:

  • 深度学习(4):torch.nn.Module
  • flink 的 Barrier 对齐 的优劣详解:
  • PHP 中 empty() 函数的作用
  • PAT甲级-1083 List Grades
  • 如何选择渲染集群管理软件?
  • css基础知识笔记
  • 【Pyside】pycharm2024配置conda虚拟环境
  • Jmeter 线程组解析
  • 产品经理如何转到AI赛道?优势在哪?待遇如何?
  • C++系列-STL容器中统计算法count, count_if
  • uniapp调用安卓service实现后台运行
  • 华为OD机试真题-最少交换次数-2024年OD统一考试(E卷)
  • fastadmin前端切换成英文,后台中文,修改JS文件
  • Milvus - 从数据库到 Partition Key 实现多租户
  • STM32 使用 CubeMX 实现按键外部中断
  • flink 为啥使用MemorySegment 来管理内存
  • 性能测试1初步使用Jmeter
  • el-table中根据状态改单元格样式
  • 医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断
  • mybatis-plus公共字段自动填充fillStrategy()方法和strictFill()方法
  • Windows环境运行.sh脚本提示找不到wget指令的问题
  • CSS基本概念以及CSS的多种引入方式
  • Python模拟真人鼠标轨迹算法
  • 使用umy-ui 优化带有大量输入框、下拉框的ElementUI el-table
  • Leetcode 1472. 设计浏览器历史记录
  • 开源音频处理项目推荐【持续更新】
  • 《C++设计新思维-泛型编程与设计模式之应用》阅读记录
  • DY按图搜索商品API:解锁电商新趋势
  • LeetCode 257. 二叉树的所有路径,dfs
  • 29. RabbitMQ队列模型