P1536 村村通
原题链接 https://www.luogu.org/problemnew/show/P1536
昨天刚学的并查集,今天正好练习一下,于是就找到了这个题
看起来好像很简单,尤其是你明白了思路之后,完全就和板子题没啥区别嘛
话是这么说,但是思路我一开始也没想到,只知道要用并查集和生成树的知识,知道看到了题解里的思路才恍然大悟,果然很简单(逃
说下我一开始的思路:
单纯又天真的认为把这几个点弄成连通图所用的最小边数再减去题目中输入的m就好啦,又想到最小边数是n-1,难道这个题的答案是n-1-m(如果是负数就为0)???
试了一下样例,完全正确!!!~~~看一下难度:普及/提高- 又一水题?
又陷入了沉思~~~题目中所给出的联通情况有可能是重复联通,或构成环!!!
例如:n=3,m=2
理想情况:1--2 1--3 这样答案就是上面的公式:0
实际情况:1--2 2--1 这不是吃撑了没事干嘛??? 对于这种情况,上面的公式就不行了!!!因为正确答案是1
所以刚刚总结的公式是要保证题目给出的联通情况不重复联通才行,或者不构成环
对于不构成环这个限制条件,可能有一些小盆友同学不理解,下面再给出一个例子:
例如: n=4,m=3
理想情况:1--2 2--3 3--4 这样答案就是上面的公式:0
实际情况:1--2 2--3 1--3 这时候1.2.3构成了一个环(可以理解成多做了一步无用功,因为利用传递1和3已经联通了,它再连一次没卵用),不符合上面的公式了,正确答案为1
那么我们有了下面的正确思路:
利用并查集,根据题目中给出的m种联通关系,把m组点联通起来,怎么连的应该不用说吧...并把每组点合并,注意要直接指向祖宗结点,也就是优化后的那种
这样联通起来的点都有一个共同的祖先,最后我们再来一重for循环判断:
- for(int i=;i<=n;i++)
- {if(f[i]==i) ans++;} //如果有一个结点的父结点仍为自己,说明它没有与其他结点联通,计算上
- cout<<ans-<<endl; //我们统计的ans是未被联通的结点的个数,那么联通它们所用的最少边就是ans-1
再注意一个小细节,判0作为结束符号!!!一开始没看到结果10个点全TLE
下面上代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int n,m,x,y,f[],ans=;
- int getf(int x) //找父结点甚至根结点
- {
- if(f[x]!=x) f[x]=getf(f[x]); //利用递归直接找到根结点
- return f[x]; //返回
- }
- void father(int x,int y) //把两个结点弄成同一父结点
- {
- int fx=getf(x);
- int fy=getf(y);
- if(fx!=fy) f[fx]=fy; //注意中括号里是x的根结点fx,这样从任何fx的子结点开始往上找都会找到y的根结点
- } //如果中括号里是x,那么只能从x的子结点往上找才能找到y的根结点,若从fx到x的结点中往上找只会找到fx
- int main()
- {
- while(scanf("%d",&n))
- {
- if(n==) break; //判0
- scanf("%d",&m);
- memset(f,,sizeof(f)); //清不清空好像无所谓
- for(int i=;i<=n;i++)
- f[i]=i; //定义初始状态
- ans=;
- if(m!=)
- {
- for(int i=;i<=m;i++)
- {
- cin>>x>>y;
- father(x,y); //弄成同一父结点
- }
- }
- for(int i=;i<=n;i++)
- {if(f[i]==i) ans++;} //如果有一个结点的父结点仍为自己,说明它没有与其他结点联通,计算上
- cout<<ans-<<endl; //因为会有一个结点已被联通但还是会被算上(它就是众结点的祖宗),所以要减去这一个
- }
- return ;
- }
P1536 村村通的更多相关文章
- 洛谷—— P1536 村村通
P1536 村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...
- 洛谷 P1536 村村通
目录 题目 思路 \(Code\) 题目 P1536 村村通 思路 并查集,一开始连通快的数量为\(n\),输入\(m\)条边时如果该边起点和终点不在同一联通块内就合并并让联通块数量减一,最后输出联通 ...
- 【洛谷】【最小生成树】P1536 村村通
[题目描述:] 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路 ...
- [LUOGU] P1536 村村通
题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...
- P1536 村村通 洛谷
https://www.luogu.org/problem/show?pid=1536 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的 ...
- P1536 村村通(洛谷)并查集
隔壁的dgdger带我看了看老师的LCA教程,我因为学习数学太累了(就是懒),去水了一下,感觉很简单的样子,于是我也来写(水)个博客吧. 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列 ...
- 【luogu P1536 村村通】 题解
题目链接:https://www.luogu.org/problemnew/show/P1536 并查集的运用,可以用生成树的思想,就是n个点生成一棵树需要n-1条边.这样我们先把已有的路连接到一个并 ...
- 洛谷 P1536 村村通(并查集)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1536 思路: 这道题可以看出是并查集的思想,然后用一个while嵌套一下,输入一条路的两个端点,就 ...
- [洛谷P1536]村村通
题意:多组数据,当n为0时结束,每组数据表示有n个村子,m条路,求还需要建多少条路,使得所有的村子联通题解:用并查集求出有多少个联通块,然后求解 C++ Code: #include<cstdi ...
随机推荐
- relief中visio图出现问题处理
需安装visio2010版本, 安装DsoFramer_KB311765_x86.exe 管理员权限打开cmd,运行regsvr32 dsoframer.ocx
- Java工具类——通过配置XML验证Map
Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...
- C#实现多级子目录Zip压缩解压实例
参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩,类似winrar,可以选择 ...
- 大华门禁SDK二次开发(一)-技术沟通
项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...
- Spinner之下拉多选,监听ID后显示不同Frgment页面
本人安卓小白,公司最近项目需要用到不同的类型的用户注册,周末下午写完记录一下. 网上找了一堆没有适合自己的(或者说我没找到),写的比较基础,欢迎大家多多指导. 老规矩,先上效果图 网上在线合成的GIF ...
- Android为TV端助力 EventBus出现has no public methods called onEvent的问题
Caused by: de.greenrobot.event.EventBusException: Subscriber class com.hhzt.iptv.lvb_w.socket.MyMsgS ...
- Spring WebFlux 响应式编程学习笔记(一)
各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...
- MyDAL - .UpdateAsync() 使用
索引: 目录索引 一.API 列表 1.UpdateAsync() 用于 单表 更新操作 二.API 单表-便捷 方法 举例-01 var pk1 = Guid.Parse("8f2cbb6 ...
- emacs 只读打开文件
emacs 只读打开文件 : C-x C-r emacs 让buffer区变成只读 : C-x C-q emacs 让只读buffer区变成可以保存修改 : C-x C-q
- IOS开发证书常见问题
1.本地Provisioning Profiles存放路径 ~/Library/MobileDevice/Provisioning Profiles 2.this action could not b ...