给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
2017-12-15 23:28
381 查看
题目描述
给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~ 输入描述:
第一行两个正整数 n 和 m 。 接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。
输出描述:
输出一个整数,表示答案
示例1
输入
4 2 1 2 3 4
输出
1
备注:
对于100%的数据,有n,m<=100000。
思路:并查集(DFS/BFS),ans为联通块个数减一
#include<iostream> #include<cstdio> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #include<list> #include<set> #include<iomanip> #include<cstring> #include<cctype> #include<cmath> #include<cstdlib> #include<ctime> #include<cassert> #include<sstream> #include<algorithm> using namespace std; #define MAXN 1000005 #define INF 0x3f3f3f3f #define PI acos(-1.0) typedef long long ll; int p[MAXN]; int fa(int x) { return x==p[x]?x:p[x]=fa(p[x]); } int main() { int n,m,u,v; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) p[i]=i; int ans=n-1; while(m--) { scanf("%d%d",&u,&v); int x=fa(u),y=fa(v); if(x!=y) { p[x]=y; ans--; } } printf("%d\n",ans); return 0; }
相关文章推荐
- hdoj 3844 Mining Your Own Business 【在无向图选择尽量少的点涂黑,使得任意删除一个点后每个BCC里面至少有一个点涂黑】
- poj 1236 Network of Schools 1)至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2)至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 堆的数据结构能够使得堆顶总是维持最大(对于大根堆)或最小(对于小根堆),给定一个数组,对这个数组进行建堆,则平均复杂度是多少?如果只是用堆的 push 操作,则一个大根堆依次输入 3,7,2,4,1,5,8 后,得到的堆的结构示意图是下述图表中的哪个?
- 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。 输入描述: 每组数组包含网格长宽W,
- Hdu 5811 Colosseo(给你一个n*n的矩阵,分成两部分,记为T1,T2,T2最多能给T1多少个点,使得给完之后的两个图仍然是竞赛图)
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 两个日期的比较, 相差多少秒,多少小时,多少分钟,都是getTime()x先获取秒,在做处理--Math.ceil(long)返回一个大于这个数的最小整数
- 任意给定两个素数p和q,p!= q,记 N = p * q ,构造Zn*,是否每个元素都有inverse?是否成群? 这个集合有多少元素?(PYTHON)
- Codeforces Beta Round #89 (Div. 2)E题,给一联通的无向图,求确定每边的方向,使得任意两点可达
- 给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- 给定n个数组编号1~n,给定一个范围,使得这个范围包含第k个数组至少ak个数的算法
- 编写一个程序,对于小于1000的正整数,通过实验确定期望产生多少个数才能使得每个数至少出现一次。
- 老太太有一筐数土豆,她两个两个一数剩一个,三个三个一数剩两个,四个四个一数剩三个,五个五个一数剩四个,六个六个一数剩五个。请问老太太至少有多少个土豆
- A和B是好友,他们经常在空闲时间聊天,A的空闲时间为[a1 ,b1 ],[a2 ,b2 ]..[ap ,bp ]。B的空闲时间是[c1 +t,d1 +t]..[cq +t,dq +t],这里t为B的起床时间。这些时间包括了边界点。B的起床时间为[l,r]的一个时刻。若一个起床时间能使两人在任意时刻聊天,那么这个时间就是合适的,问有多少个合适的起床时间?
- 二、给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- LA 4593 给一个无向图 让每一条边有方向 使得这个图无环 且最长链最短