首页 > 其他分享 >[刷题笔记] P2881

[刷题笔记] P2881

时间:2024-02-20 10:47:36浏览次数:23  
标签:闭包 关系 int 笔记 传递 P2881 Floyd 刷题

例题:P2881

注意到 \(n \le 1000\)。数据较小。且有传递性,即如果 \(x,y\) 关系确定,\(y,z\) 关系确定,那么 \(x,z\) 关系确定。考虑传递闭包。

传递闭包从关系图的角度来说,如果原图上存在一条 \(u,v\) 路径,那么传递闭包就将 \(u,v\) 连边。

传递闭包可以使用 Floyd 算法解决。枚举中间点 \(k\),如果 \(\{i,k\}\{k,j\}\) 关系确定,那么 \(\{i,j\}\) 关系确定。

传递闭包 Floyd 算法如下:

void Floyd()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++) f[i][j] |= (f[i][k] && f[k][j]);
		}
	}
}

但此时的时间复杂度是 \(O(n^3)\) 级别。无法接受。

我们只需要枚举每条边即可。对于边 \(i,j\) ,如果 \(i,j\) 有边,则能走到 \(i\) 的一定能走到 \(j\)。转移即可。这里可以使用 bitset 优化。


对于本题,我们已知一些关系,基于这些关系跑传递闭包即可。

参考代码如下

#include <bits/stdc++.h>
using namespace std;
const int N = 10010; 
bitset <N> b[N];
int n,m;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		b[x][y] = 1;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if( b[j][i])
			{
				b[j] |= b[i];
			}
		}
	}
	int ans = n*(n-1)/2;
	for(int i=1;i<=n;i++) ans -= b[i].count();
	cout<<ans<<endl;
	return 0;
}

标签:闭包,关系,int,笔记,传递,P2881,Floyd,刷题
From: https://www.cnblogs.com/SXqwq/p/18021663

相关文章

  • MySQL 零碎笔记2
    1.分区表适用场景:业务简单,单表查询,且都跟时间范围查询相关。数据需要定期清理数据,无需保留全部数据。数据更新频率较低,只有写入操作。优点:查询条件包含分区条件时,可以直接扫描必要的分区。也可以直接指定必要的分区来提高查询效率。聚合查询时,可以很容易地在每个分区上并行......
  • 吴恩达深度学习笔记
    深度学习框架有很多种,都是封装好的,基本是不用我们处理,只要完成正向传播,反向传播就能通过框架完成,需要自己去选择学习合适的框架,并且知道如何运用; ————————————————————————————————————————————————————————————......
  • Programming Abstractions in C阅读笔记:p283-p292
    《ProgrammingAbstractionsinC》学习第72天,p283-p292总结,总计10页。一、技术总结1、anylasisofalgorithms算法分析——即判断程序的效率(efficiency)。2、mathematicalinduction(数学归纳法)3、Big-Onotation(大O标记法)4、constanttime(常量时间)5、lineartime(......
  • RabbitMQ 学习笔记 - 2
    WorkQueues工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。3.1......
  • 2.19 闲话 & 学习笔记 『 望向这片懵懂的土地/嘈杂念想充斥着思绪 』
    昨天没发闲话,今天事情太乱来不及写学术内容放昨天的学术内容吧今天去面试,感觉说的跟个......
  • Go语言精进之路读书笔记第29条——使用接口作为程序水平组合的连接点
    如果说C++和Java是关于类型层次结构和类型分类的语言,那么Go则是关于组合的语言。——RobPike,Go语言之父“偏好组合,正交解耦”29.1一切皆组合在语言设计层面,Go提供了诸多正交的语法元素供后续组合使用,包括:Go语言无类型体系(typehierarchy),类型定义独立;方法和类型是正交......
  • 数学专题集训笔记
    感谢lsy学长来101给我们上课~Day1逆元对于一个\(a\),当\(ab\equiv1\pmod{m}\)时我们把\(b\)的最小整数解称作\(a\)模\(m\)的逆元,记作\(a^{-1}\)或\(\frac{1}{a}\)。接下来我们来看看逆元的求法。费尔马小定理如果\(a\)是一个整数,\(p\)是一个质数,则有\[a^p\e......
  • 读书笔记3
    第三章软件工程师的成长这章主要讨论软件工程师个人能力衡量及发展,一些思维误区和以后的职业发展在团队工作中,稳定、一致的交付时间时衡量一个员工能力的重要方面初级软件工程师的成长包括以下几种:(1)积累软件开发相关的知识,提升技术技能(如对具体技术的掌握,动手能力)。例如:对JAV......
  • FOI2023 冬令营笔记
    Day1基础算法:二分:求解满足\(x\)条件的最小\(y\)值\(\Rightarrow\)二分一个答案\(y\),判断\(y\)是否满足\(x\)条件时间复杂度:log二分答案,暴力地判断标志:最小xx的最大值/最大xx的最小值贪心:思考顺序:分治:对于一个问题,把它分解成两个大小相等的子问题,通过log层......
  • 算法学习笔记(45): 快速沃尔什变换 FWT
    遗憾的是math里面一直没有很好的讲这个东西……所以这次细致说说。FWT的本质类似于多项式卷积中,利用ntt变换使得卷积\(\to\)点乘,fwt也是类似的应用。定义某种位运算\(\oplus\),那么fwt处理的位运算卷积形如:\[H=F*G\impliesH_k=\sum_{i\oplusj=k}F_iG_......