原题链接 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 村村通的更多相关文章

  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 思路: 这道题可以看出是并查集的思想,然后用一个while嵌套一下,输入一条路的两个端点,就 ...

  9. [洛谷P1536]村村通

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

随机推荐

  1. 【带着canvas去流浪】(1)绘制柱状图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 思考题 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端& ...

  2. log4j日志框架的使用

    java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logge ...

  3. windows如何安装memcached

    官网上并未提供 Memcached 的 Windows 平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可: 32位系统 1.2.5版本:http:/ ...

  4. 008. 阻塞&非阻塞、同步&异步

    阻塞 非阻塞:关注的对象是调用者: 阻塞:调用者发起调用后,处于等待状态,直到该调用有返回: 非阻塞:调用者发起调用后,不需要等待返回,可以往下执行: 同步 异步:  关注的对象是被调用者: 同步:服 ...

  5. (七) Keras 绘制网络结构和cpu,gpu切换

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 首先安装py ...

  6. Android开发支付集成——支付宝集成

    微信支付传送门:https://www.cnblogs.com/dingxiansen/p/9209159.html 一.支付宝支付 1. 支付宝支付流程图 2. 集成前准备 去蚂蚁金服注册应用获取a ...

  7. 好代码是管出来的——使用GitHub

    前面的文章介绍了Git的基本概念和用法,本文则是基于GitHub的一个实践介绍,主要内容有: GitHub简介 个人与组织 仓库的创建与维护 Fork与pull request 小结 GitHub简介 ...

  8. Django-1- urls的路由配置, 命名, 重定向, path及re_path

    1-项目目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/index/      2-APP目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/t ...

  9. VS Code常用快捷键大全

    常用 General 按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick O ...

  10. mstsc远程连接发生身份验证错误要求的函数不受支持

    在win7电脑上使用远程连接连接一台服务器时,出现发生身份验证错误要求的函数不受支持的错误,原因是本地组策略配置错误,如下图: 解决办法: 进入windows命令行模式输入命令: 会弹出本地策略组编辑 ...