P1536 村村通

这是一道比较模板的生成树和并查集题,想了一会然后敲出来了,但是因为下标没有从1开始调了半天……

(啊,我这人就爱犯这种错误)

那么,思路是什么呢?

我们发现,每连成1个环,就要多浪费1条边,因为这1条路本来可以往外再连接1个村庄的。

所以,我们需要跑一遍最小生成树,计下cnt,也就是形成环的边的总数。

用m(边的个数)去减cnt,得到的结果就是不形成环的边的总数,存入一个临时变量t中。

这些边经过点的个数就是边的个数+1,即t+1。

最后,用点的总数去减,得到剩下的没有连接的点的个数,输出即可。

附上代码:

 1 #include<iostream>
2 using namespace std;
3 struct edge{
4 int u,v;
5 }edges[500010];//完全图中m=n(n-1)/2
6 int n,m,fa[1010];
7 int find(int x){//并查集之 查
8 if(fa[x]==x) return x;
9 return fa[x]=find(fa[x]);
10 }
11 int main(){
12 while(cin>>n){
13 if(n==0) break;
14 cin>>m;
15 for(int i=1;i<=n;i++) fa[i]=i;
16 for(int i=1;i<=m;i++){
17 cin>>edges[i].u>>edges[i].v;
18 }
19 int cnt=0;
20 for(int i=1;i<=m;i++){
21 int x=find(edges[i].u),y=find(edges[i].v);
22 if(x==y){//形成环
23 cnt++;
24 continue;
25 }
26 fa[x]=y;//并查集之 并
27 }
28 int t=m-cnt;
29 cout<<n-t-1<<endl;
30 }
31 return 0;
32 }

其实这一份代码还是有一些缺陷的,比如说完全不需要用结构体数组来存,现读现算即可。可是懒得改啦

个人感觉生成树一类的题目都不用单独去写一个union(合并)函数,直接在主函数中一个语句完事。毕竟生成树都是在两点祖先不同的时候进行合并,既不用再求一次祖先,也不需要单独判断要不要合并。

洛谷的题解中,大部分的思路和这个不太一样。主要是:跑完最小生成树记录多少点的祖先是它本身(祖先是本身就说明这是一个连通块),输出时减去1;也有用桶来存祖先节点,然后遍历输出为1的个数……但除了初始化,这些算法都免不了一两个n次的循环,但我这个算法不需要(嘿嘿)

第一次写题解,感觉很多地方写得不是很清晰,如果有任何想说的请发在评论区,我会认真阅读的。谢谢!

[题解]P1536 村村通的更多相关文章

  1. 洛谷—— P1536 村村通

    P1536 村村通 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...

  2. 洛谷 P1536 村村通

    目录 题目 思路 \(Code\) 题目 P1536 村村通 思路 并查集,一开始连通快的数量为\(n\),输入\(m\)条边时如果该边起点和终点不在同一联通块内就合并并让联通块数量减一,最后输出联通 ...

  3. 【洛谷】【最小生成树】P1536 村村通

    [题目描述:] 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路 ...

  4. [LUOGU] P1536 村村通

    题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连, ...

  5. P1536 村村通 洛谷

    https://www.luogu.org/problem/show?pid=1536 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府“村村通工程”的 ...

  6. P1536 村村通(洛谷)并查集

    隔壁的dgdger带我看了看老师的LCA教程,我因为学习数学太累了(就是懒),去水了一下,感觉很简单的样子,于是我也来写(水)个博客吧. 题目描述 某市调查城镇交通状况,得到现有城镇道路统计表.表中列 ...

  7. 【luogu P1536 村村通】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1536 并查集的运用,可以用生成树的思想,就是n个点生成一棵树需要n-1条边.这样我们先把已有的路连接到一个并 ...

  8. P1536 村村通

    原题链接 https://www.luogu.org/problemnew/show/P1536 昨天刚学的并查集,今天正好练习一下,于是就找到了这个题 看起来好像很简单,尤其是你明白了思路之后,完全 ...

  9. [洛谷P1536]村村通

    题意:多组数据,当n为0时结束,每组数据表示有n个村子,m条路,求还需要建多少条路,使得所有的村子联通题解:用并查集求出有多少个联通块,然后求解 C++ Code: #include<cstdi ...

  10. 洛谷 P1536 村村通(并查集)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1536 思路: 这道题可以看出是并查集的思想,然后用一个while嵌套一下,输入一条路的两个端点,就 ...

随机推荐

  1. 【2020.11.25提高组模拟】太空漫步(walking) 题解

    [2020.11.25提高组模拟]太空漫步(walking) 题解 题目描述 Do not go gentle into that good night. Old age should burn an ...

  2. Go中的interface(接口)

    接口 接口(interface)定义了一个对象的行为规范,之定义规范不实现,由具体的对象来实现规范的细节. 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型. interfa ...

  3. [推荐收藏]JavaScript书籍精读笔记系列导航

    写在前面 去年我整理了一份「前端工程师必备书籍清单.md」,得到很多人的关注.这份清单里面的书籍大部分我都看过了,但有些知识点难免看后就忘.之前看这些书对一些重点都进行了记录,最近一段时间计划把这些重 ...

  4. ChunJun FTP Connector 功能扩展解读

    本文将从 FTP Connector的功能详解,自定义文件切割及自定义 FileFormat 三个方面为大家带来 ChunJun FTP Connector 的功能扩展分享. FTP Connecto ...

  5. 基于Casbin的ABAC授权模型设计与开发踩坑实录

    本文分享自天翼云开发者社区<基于Casbin的ABAC授权模型设计与开发踩坑实录>,作者:upclose 最近因项⽬需求,需要寻求⼀个好⽤强⼤的权限管理⽅案.天翼云安全实验室经过仔细调研, ...

  6. jsrpc+mitmproxy联动burp实现加密自动化

    前言 在测试中发现,数据包中存在一个签名字段,将请求体进行修改后,服务器会302跳转到登录页 创建Jsrpc连接 根据关键字找到sign生成位置,并发现其加密的参数为请求体中"&se ...

  7. Linux 查找Redis配置信息

    前言 有时在使用Redis时密码或者配置信息经常忘记,应该怎么找回呢? 解决 如果设置了自启动,先查找服务状态(systemctl status redis服务名称) 根据服务可以找到服务的启动脚本, ...

  8. ChatGPT搅动AI芯片的“一池春水”

    这是IC男奋斗史的第37篇原创 本文1520字,预计阅读4分钟. ChatGPT是什么以及它的发展历程,相信各位老铁们都已经很清楚,杰哥便不再赘述.大家都知道,杰哥是做AI芯片的,ChatGPT与杰哥 ...

  9. Layui 更新Table 表格内容的值

    $.ajax({ //请求方式 type: "POST", //请求地址 url: "/", //数据,json字符串 data: { }, //请求成功 su ...

  10. Django+DRF 实战:序列化器 ValidationError 触发机制完整指南

    一.ValidationError 异常优先级 序列化器验证顺序 第一级:字段内置验证 序列化器先进行字段内置验证,像 min_length.required这类.一旦验证不通过,就会立即抛出 Val ...