畅通工程,How Many Tables ACM第九天-图论

简介: 下面两题的方法是一样的都是并查集的应用; 并查集的重点就是找到祖先节点的过程。 重点在这里:int find(int x){ return p[x] == x ? x : p[x] = find( p[x]); } 不断地递归,递归到找到自己是自己的祖先为止。
下面两题的方法是一样的都是并查集的应用;
并查集的重点就是找到祖先节点的过程。
重点在这里:int find(int x){ return p[x] == x ? x : p[x] = find( p[x]); }
不断地递归,递归到找到自己是自己的祖先为止。并且把它取接到那个祖先节点上;这样可以节省空间和时间。

How Many Tables

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15414    Accepted Submission(s): 7560


Problem Description
Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers.

One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table.

For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least.
 

Input
The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases.
 

Output
For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks.
 

Sample Input
 
 
2 5 3 1 2 2 3 4 5 5 1 2 5
 

Sample Output
 
 
2 4
 

Author
Ignatius.L
 

Source
 

Recommend
Eddy
 


#include <cstdio>
#define maxn 1005
using namespace std;
int p[maxn];
int a[maxn];
int b[maxn];
int find(int x){
	return	p[x] == x? x : p[x] = find(p[x]);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d %d",&n,&m);
		for(int i = 1;i <= m;i++){
			scanf("%d %d",&a[i],&b[i]);
		}
		int ans = 0;
		for(int i = 1;i <= n;i++){
			p[i] = i;
		}
		for(int i = 0;i <= m;i++){
			int x = find(a[i]);
			int y = find(b[i]);
			if(x != y){
				ans++;
				p[x] = y;
			}
		}
		int answer = n - ans;
		printf("%d\n",answer);
	}
	return	0;
}

畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32971    Accepted Submission(s): 17391


Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 
 

Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。 
 

Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。 
 

Sample Input
 
     
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
 

Sample Output
 
     
1 0 2 998
Hint
Hint
Huge input, scanf is recommended.
 

Source
 

Recommend
JGShining
 

 
 
#include <cstdio>
#include <cstring>

using namespace std;
#define maxn 1005
int p[maxn];
int a[maxn];
int b[maxn];
int find(int x){
	return	p[x] == x? x : p[x] = find(p[x]);
}
int main(){
	int n,m;
	while(scanf("%d %d",&n,&m) && n){
		memset(p,0,sizeof(p));
		for(int i = 1;i <= m;i++){
			scanf("%d %d",&a[i],&b[i]);
		}
		int ans = 0;
		for(int i = 1;i <= n;i++){
			p[i] = i;
		}
		for(int i = 0;i <= m;i++){
			int x = find(a[i]);
			int y = find(b[i]);
			if(x != y){
				ans++;
				p[x] = y;
			}
		}
		int answer = n - 1 - ans;
		printf("%d\n",answer);
	}
	return	0;
}


相关文章
|
5月前
|
机器学习/深度学习 存储 算法
【博士每天一篇文献-综述】2024最新联邦遗忘综述:Federated unlearning A survey on methods, design guidelines
本文提供了联邦遗忘(Federated Unlearning, FU)领域的全面综述,包括背景概念、动机、挑战、设计指南、评估指标体系,并探讨了FU在隐私保护和安全性方面的应用,以及面临的技术挑战和未来研究方向。
180 3
|
机器学习/深度学习 人工智能 PyTorch
被誉为「教科书」,牛津大学231页博士论文全面阐述神经微分方程,Jeff Dean点赞
被誉为「教科书」,牛津大学231页博士论文全面阐述神经微分方程,Jeff Dean点赞
232 0
|
机器学习/深度学习 算法 数据挖掘
Chapter1 统计学习方法概论
第1章 统计学习方法概论 1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。 2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。 3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。 4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训
Chapter1 统计学习方法概论
|
机器学习/深度学习 自然语言处理 算法
graphSage还是HAN ?吐血力作综述Graph Embeding 经典好文
graphSage还是HAN ?吐血力作综述Graph Embeding 经典好文
graphSage还是HAN ?吐血力作综述Graph Embeding 经典好文
|
存储 缓存 算法
[SIGMOD 22 学习]《Adaptive Hybrid Indexes》解读
本文是学习总结,有错误处欢迎交流。
428 0
|
算法 程序员 数据库
《数据库系统概论》十一章汇总--基于《数据库系统概论》第五版王珊一书|第九章--关系查询处理和查询优化
系列的博客都是基于《数据库系统概论》第五版王珊一书,进行的知识总结和课后习题汇总,从第一章到第十一章,如果觉得不错记得收藏点个赞吧~你的小小支持,是我的大大动力!
191 0
|
算法 Java Python
ACM 选手图解 LeetCode 相同的树
ACM 选手图解 LeetCode 相同的树
ACM 选手图解 LeetCode 相同的树
|
人工智能 算法 BI
算法比赛模拟题精解之“Tairitsu and Dynamic Objects”
根据题意,分析得知,Hikari 和 Tairitsu 每次会优先选择 ai+bi 的值最大的物品,当物品的 ai+bi 值相等时,选择bi大的那个。
|
算法 Shell 数据库
ACM-ICPC 常用算法刷题网站整理(转)
ACM-ICPC 常用算法刷题网站整理          转载From http://blog.csdn.net/bat67/article/details/72765485          以及http://blog.csdn.net/pinellina/article/details/46843165  感谢原作者。
3064 0