首页 > 其他分享 >洛谷P1536 村村通

洛谷P1536 村村通

时间:2024-08-17 17:15:24浏览次数:11  
标签:P1536 连通 洛谷 int 查集 ans go return 村村通

传送门:P1536 村村通

人间风起,四季同书。(还是一篇 817 的做题记录la~)

题意:

有好多组数据,每组数据给你 m 条无向边的信息(u,v);
问你最少再添加多少条边就能使整张图连通。

思路:

首先我们要知道,一个图如果连通,边的数量最少是 n-1

但是题目会出现这样一种情况:

n = 4,m = 3;
1 <——> 2 , 2 <——> 3 , 3 <——> 1;

这时候整张图变成了一个环和一个孤点,整张图并不联通
我们再观察会发现:
1 与 3 相连之前,1 与 3 就已经属于一个连通块了
换句话说就是 最后一条边加与不加是等效的
特殊 --> 一般:
如果两个点在添加这一条边之前已经属于同一连通块,就可以看作没有这条边
很自然地想到 并查集 就是求 kruscal 的东东
就是在读入两个点时,用 ans 记录此时加入图中对连通性真正有用的边的数量

  • 如果 他们不属于同一个连通块,那么这条边有用,将两个点所在的连通块合并,ans+1;
  • 如果 他们已经属于同一个连通块,那么这条边没用,不做任何处理

就转换成:
并查集 合并两个连通块、查询祖先
还是很好实现的啦 !

最终代码:

  • 注意这个 非常神经 有意思的输入
  • 并查集查寻祖先时,路径压缩(我的爸爸的祖先就是我的祖先)
  • 最终答案是 n-1(图中应当有的有用边的数量)与 ans(现在图中有用边的数量)的差
#include<bits/stdc++.h>

using namespace std;

const int maxn=1010;

int m,n;
int to[maxn];
int ans;

int go(int p)
{
	if(p==to[p])return to[p];
	else return to[p]=go(to[p]);//路径压缩 
}

int main()
{
	while(1)
	{
		ans=0;
		cin>>n;
		if(n==0)return 0;//注意一下这个奇葩的读入 
		cin>>m;
		for(int i=1;i<=n;i++)
		{
			to[i]=i; 
		}
		for(int i=1;i<=m;i++)
		{
			int x,y; 
			cin>>x>>y;
			if(go(x)!=go(y))//还不属于一个并查集
			{
				//合并
				ans++;
				to[go(x)]=to[go(y)];
			} 
		}
		cout<<n-1-ans<<endl;
	}
	return 0;
 } 

后记:

  • 这道题目主要考察了 并查集 的有关知识 非常板子
  • 当然也能用 kruscal 将每个边的边权置为 1 ,求一边最小生成树,再用 n-1-树的大小(其实就是多开一个结构体,基本方法还是并查集)计算还应当修建的路径条数。

标签:P1536,连通,洛谷,int,查集,ans,go,return,村村通
From: https://www.cnblogs.com/lazy-ZJY0307/p/18364657

相关文章

  • 洛谷 B3735 B3736 B3787 题解
    嘿嘿我发烧已经好了!题目目录:No.1 B3735[信息与未来2018]圣诞树No.2 B3736[信息与未来2018]最大公约数No.3 B3787[信息与未来2023]精密计时 OK,开始正文!第一题:B3735[信息与未来2018]圣诞树 题目描述圣诞树共有 nn 层,从上向下数第 11 层有 11 个......
  • 洛谷P5663 [CSP-J2019] 加工零件
    传送门:P5663[CSP-J2019]加工零件这是一篇写于2024.8.17的做题记录,祝稻米朋友们节日快乐。废话还是少说一点比较好qwq题目意思:(一个很抽象的东西)说白了其实就是给你一张无向图,然后有p次询问,每次询问给你一个v和L,问你从1号点到v号点有没有长度为L的边。注意......
  • 洛谷p1717题解
    题目描述话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。但是,因为还要准备NOIP2013,z老师只给了他 H 个小时的空余时间,假设有 n 个鱼塘都在一条水平路边,从左......
  • 洛谷p2580题解
    题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞......
  • 洛谷——P1102 A-B 数对
    题目背景出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的A+BProblem,改用A-B了哈哈!题目描述给出一串正整数数列以及一个正整数CCC,......
  • 洛谷——P1093 [NOIP2007 普及组] 奖学金
    题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都有......
  • 洛谷题单指南-常见优化技巧-P2866 [USACO06NOV] Bad Hair Day S
    原题链接:https://www.luogu.com.cn/problem/P2866题意解读:每个牛能看到的右边比他矮的牛,直到有比他高的挡住为止,因此只用找每个牛右边第一个比他高的牛的位置即可计算中间比他矮的有多少。解题思路:典型的单调栈应用,注意,常规的单调栈可以用来:1、找每个数左边第一个比他小的数的......
  • 洛谷题单指南-常见优化技巧-P4147 玉蟾宫
    原题链接:https://www.luogu.com.cn/problem/P4147题意解读:找到一个只包含'F'的最大的子矩形。解题思路:方法1:设R为0,F为1,先计算二维前缀和,再枚举所有子矩形左上角(x1,y1)、右下角(x2,y2),计算子矩形的区间和,更新最大值,只能得到部分分。方法2:对于二维矩阵每个点,定义三个属性:h[][]......
  • 洛谷P1786
    6.帮贡排序题目链接:[P1786帮贡排序-洛谷|计算机科学教育新生态(luogu.com.cn)]()题目背景在absi2011的帮派里,死号偏多。现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。题目描述目前帮派内共最多有一位帮主,......
  • 洛谷P2789 直线交点数 题解
    解题思路考虑将直线分组,每组内直线互相平行,任意两组直线间交点数量等于两组内直线数量乘积。分组操作使用dfs,求出交点数量后加入set去重,输出set大小。时间复杂度O(2NN2)有点鬼畜但是可以通过。实现#include<cstdio>#include<unordered_set>inta[30];std::unordered_set......