首页 > 其他分享 >并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路

并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路

时间:2024-03-26 12:31:43浏览次数:20  
标签:输出 int 查集 P1656 include find 模板

并查集模板

f数组要初始化
auto find(auto x)
{
    if(f[x]==x) return x;
    else return f[x]=find(f[x])路径压缩,同一条路上都归到一个点上
}

void unionset(auto a,auto b)
{
    f[find(a)]=find(b);   auto会自动适配数据类型
}

 P3367 【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来 M 行,每行包含三个整数 Zi​,Xi​,Yi​ 。

当 Zi​=1 时,将 Xi​ 与 Yi​ 所在的集合合并。

当 Zi​=2 时,输出 Xi​ 与 Yi​ 是否在同一集合内,是的输出 Y ;否则输出 N 。

输出格式

对于每一个Zi​=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。

输入输出样例

输入 

4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4

输出 

N
Y
N
Y

思路 :就是并查集模板的套用,首先先给f数组初始化,接着就是对输入的数字判断,看是合并,还是查看是否同组,然后直接调用函数就行了

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int n,k;
int z,x,y;
int f[10010];
vector<int> vv(10010,1);初始化为1

int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}

void unity(int x,int y)
{
	x=find(x),y=find(y);   按秩合并,直接用模板的也行,用这个的目的是合并的时候下面数字少的
	if(x==y) return;       祖先认下面数字多的祖先为祖先,这样查找快点
	if(vv[x]>vv[y]) swap(x,y);
	f[x]=y;
	vv[x]+=vv[y];
}

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++) f[i]=i;数组初始化,即认自己为祖先
	while(k--)
	{
		cin>>z>>x>>y;
		if(z==1) unity(x,y);
		else
		{
			x=find(x),y=find(y);
			if(x==y) cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
	}
	return 0;
}

P1656 炸铁路

题目描述

A 国派出将军 uim,对 B 国进行战略性措施,以解救涂炭的生灵。

B 国有 n 个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。 

uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。

uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。

然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?

输入格式

第一行 n,m(1≤n≤150,1≤m≤5000),分别表示有 n 个城市,总共 m 条铁路。

以下 m 行,每行两个整数 a,b,表示城市 a 和城市 b 之间有铁路直接连接。

输出格式

输出有若干行。

每行包含两个数字 a,b,其中a<b,表示 〈a,b〉 是 key road。

请注意:输出时,所有的数对 〈a,b〉 必须按照 a 从小到大排序输出;如果a 相同,则根据 b 从小到大排序。

输入输出样例

输入 

6 6
1 2
2 3
2 4
3 5
4 5
5 6

输出 

1 2
5 6

输入 

10 9
2 1
3 1
4 1
10 4
9 4
6 3
7 3
8 3
5 3
​​​​​​​

输出 

1 2
1 3
1 4
3 5
3 6
3 7
3 8
4 9
4 10

思路:每次从其中拿走一条边,然后就套用并查集的模板,把剩下的边合并,然后就是遍历数组,如果会出现祖先不同的情况,就输出拿走的那一条边

有几点要注意一下,就是要给数据排序,还有a有可能大于b,针对这个要判断一下

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int>PII;
int n,m;
PII q[5010];
int f[160];

bool compare(PII a,PII b)
{
	if(a.first==b.first) return a.second<b.second;
	return a.first<b.first;
}

int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}

void unionset(int a,int b)
{
	f[find(a)]=find(b);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].first>>q[i].second;
		if(q[i].first>q[i].second) swap(q[i].first,q[i].second);
	}
	sort(q+1,q+1+m,compare);
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++) f[j]=j;
		for(int j=1;j<=m;j++)
		{
			if(i!=j) unionset(q[j].first,q[j].second);
		}
		
		for(int j=2;j<=n;j++)
		{
			if(f[find(j)]!=f[find(j-1)])
			{
				cout<<q[i].first<<" "<<q[i].second<<endl;
				break;
			}
		}
	}
	return 0;
}

还有一道简单的并查集题目,蓝桥杯的,合根植物,可以看我另一个博客

https://blog.csdn.net/jia_jia_LL/article/details/136978255?spm=1001.2014.3001.5501

标签:输出,int,查集,P1656,include,find,模板
From: https://blog.csdn.net/jia_jia_LL/article/details/137026097

相关文章

  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......
  • golang模板库之fasttemplate
    简介fasttemplate是一个比较简单、易用的小型模板库。fasttemplate的作者valyala另外还开源了不少优秀的库,如大名鼎鼎的fasthttp,前面介绍的bytebufferpool,还有一个重量级的模板库quicktemplate。quicktemplate比标准库中的text/template和html/template要灵活和易用很多,后面会专......
  • 洛谷 P1656 炸铁路
    题意:n个点,m条边,问有哪条边是去掉之后,会造成之前连通的点不再连通的?n<=150,m<=5000.思路:连通算法有dfs+bool数组记录,或者dsu,感觉dsu更方便。m*n不超过1e6,直接暴力。classDisjointSet{public:DisjointSet(intsz):sz_(sz){set_size_.assign(sz_,1);......
  • 并查集(反集)进阶 P1892 [BOI2003] 团伙
    现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:一个人的朋友的朋友是朋友一个人的敌人的敌人是朋友现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。输入格式第一行输入一个整数 n 代表人数。第二行......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • 算法基础模板
    目录算法模版——基础篇1、整数二分2、浮点数二分3、高精度加法4、高精度减法5、高精度乘低精度6、高精度除以低精度7、一维前缀和8、二维前缀和9、一维差分10、二维差分11、位运算12、双指针算法13、离散化14、区间合并15、单链表16、双链表17、栈18、队列1.普通队列2.循环队列......
  • Django框架之模板层
    【一】模板语法的传取值模板语法需要记两组符号,分别是{{}}和{%%}{{}}通常是与变量相关的{%%}通常是与逻辑相关的【1】传值模板语法可以传递python所有的数据类型,包括函数和类,以及类实例化的对象传递函数的时候,函数需要有返回值,要不然在页面显示的结果就是None模板语法......
  • 算法模板 v1.10.4.20240325
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • 一文整合工厂模式、模板模式、策略模式
    为什么使用设计模式今天终于有时间系统的整理一下这几个设计模式了,这几个真是最常用的,用好了它们,你就在也不用一大堆的ifelse了。能更好的处理大量的代码冗余问题。在我们的实际开发中,肯定会有这样的场景:我们的某个方法被多次重复调用,但是每次呢,还需要稍微的改动里面一......
  • MyBatisPlus新版代码生成器(Velocity模板引擎详解)
    文章目录一、Velocity模板引擎1、velocity简介2、快速入门3、基础语法4、注释5、变量6、循环7、条件8、引入资源9、macro宏二、MybatisPlus代码生成器1、MP代码生成器2、自定义velocity模板2.1、MybatisPlus自带模板和变量2.2、公共模板`common.vm`文件2.3、实体模板`en......