畅通工程

畅通工程
题面


题意找出最少要加几条路才可以让所有城市之间连通
分析
这是一道有关并查集的题目,就是确定连通分量的个数
以下是并查集的原理

以上图为例,h是b的父亲节点,c是b的根节点。如果两个节点之间有联系,那么其中一个点就是另一个点的父亲节点。以此类推,最高层即没有父亲节点的点成为根节点。
如何判断b与g之间是有联系(b与g的根节点如果有联系就代表这两个点有联系)
b->h->c
g->d->f
如果c与f是有联系的,那么这两颗树就是有联系的,也就是说这两颗树可以合并成一棵树,那么b与g是有联系的。
概念上可以很简单地理解,但是代码稍微难理解一点。
代码:

int Find(int x)
{
	while(father[x]!=x)
		x=father[x];
	return x;//返回最初x根节点的位置,所以使用while循环直到根节点(根节点的father[x]=x)
}
//合并函数
void combine(int a,int b)
{
    int temp_a,temp_b;
	temp_a=Find(a);
	temp_b=Find(b);
	if(temp_a!=temp_b)
		father[temp_a]=temp_b;//写成father[temp_b]=temp_a也是可以的
	return ;
}
//确定连通分量个数

当我们掌控这两个函数的时候就可以用并查集来求解连通分量的个数
直接用循环查找father[i]与i是否相等来更新连通分量的个数。
而本道题的答案就是连通分量的个数-1

AC代码

/* 找到连通块的个数 连通块个数-1就是ans */
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m,father[1005],a,b,cnt=0,ra,rb;
int Find (int t){
while(father[t]!=t) t=father[t];
return t;
}
int main(){
while(scanf("%d",&n),n){
cnt=0;
scanf("%d",&m);
for(int i=1;i<=n;i++)
father[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
ra=Find(a);
rb=Find(b);
if(ra!=rb) father[ra]=rb;
}
for(int i=1;i<=n;i++)
if(father[i]==i) cnt++;
cout<<cnt-1<<endl;
}
return 0;
}
//Itree98大佬提供
#include <stdio.h>
const int MAX=1000;
int father[MAX];
 
//初始化函数
void Init(int n)
{
    int i;
	for(i=1;i<=n;i++)
		father[i]=i;
}
//查找函数
int Find(int x)
{
	while(father[x]!=x)
		x=father[x];
 
	return x;
}
//合并函数
void combine(int a,int b)
{
    int temp_a,temp_b;
	temp_a=Find(a);
	temp_b=Find(b);
 
	if(temp_a!=temp_b)
		father[temp_a]=temp_b;
}
//确定连通分量个数
int find_ans(int n)
{
    int i,sum=0;
    for(i=1;i<=n;++i)
        if(father[i]==i)
            ++sum;
    return sum;
}
 
int main()
{
	int i,n,m,a,b;
 
	while(scanf("%d",&n)!=EOF)
	{
	    if(!n)  break;
		Init(n);
		scanf("%d",&m);
 
		for(i=0;i<m;++i)
		{
			scanf("%d%d",&a,&b);
			combine(a,b);
		}
		printf("%d\n",find_ans(n)-1);
	}
	return 0;
}
 

总结
以后遇到图论中求连通分量的个数的时候使用并查集就可以解决
其实第一个AC代码耗时只有15ms,而大佬提供的有31s,所以为了代码运行速度更快,
可以尝试把有些简单的函数放在主函数里面。

全部评论

相关推荐

東大沒有派對:这是好事啊(峰哥脸
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 你的mentor是什么样的人? #
4588次浏览 33人参与
# 你觉得mentor喜欢什么样的实习生 #
10776次浏览 297人参与
# 未岚大陆求职进展汇总 #
38160次浏览 114人参与
# 帮我看看,领导说这话什么意思? #
6729次浏览 28人参与
# 26届秋招公司红黑榜 #
13421次浏览 44人参与
# 怎么给家人解释你的工作? #
1748次浏览 17人参与
# 智慧芽求职进展汇总 #
26075次浏览 110人参与
# 没有家庭托举的我是怎么找工作的 #
12806次浏览 161人参与
# 求职低谷期你是怎么度过的 #
5470次浏览 97人参与
# 实习必须要去大厂吗? #
146898次浏览 1542人参与
# 从哪些方向判断这个offer值不值得去? #
6825次浏览 95人参与
# 同bg的你秋招战况如何? #
158912次浏览 927人参与
# 度小满求职进展汇总 #
10248次浏览 53人参与
# 校招泡的最久的公司是哪家? #
4894次浏览 23人参与
# 面试紧张时你会有什么表现? #
1811次浏览 21人参与
# 你有哪些缓解焦虑的方法? #
37215次浏览 835人参与
# 你喜欢工作还是上学 #
77633次浏览 860人参与
# 入职第一天,你准备什么时候下班 #
85528次浏览 467人参与
# 秋招想进国企该如何准备 #
97761次浏览 487人参与
# 简历无回复,你会继续海投还是优化再投? #
103636次浏览 819人参与
# 机械人的工作环境真的很差吗 #
25100次浏览 119人参与
# 独居后,你的生活是更好了还是更差了? #
28161次浏览 263人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务