博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
D.加边的无向图
阅读量:5961 次
发布时间:2019-06-19

本文共 1284 字,大约阅读时间需要 4 分钟。

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~ 

输入描述:

第一行两个正整数 n 和 m 。 接下来的m行中,每行两个正整数 i 、 j ,表示点i与点j之间有一条无向道路。

输出描述:

输出一个整数,表示答案
示例1

输入

4 21 23 4

输出

1

备注:

对于100%的数据,有n,m<=100000。 分析:并查集。
1 #include
2 #include
3 4 int N,M;//N个点M条边 5 int pre[200012];//pre[i]=x表示点i的父亲节点为点x 6 int a[200012]; 7 void init()//初始化N个元素pre[x]=x,即开始时有N个集合 8 { 9 for(int i=0;i<=N;i++) pre[i]=i;10 }11 12 int find(int x)//查询某点所在树的根 13 {14 int root=x;15 while(pre[root]!=root)16 root=pre[root];17 18 int i=x,k;19 while(k!=root)//路径压缩,让x所在树的所有节点直接指向根节点 20 {21 k=pre[i];22 pre[i]=root;23 i=k;24 }25 return root; 26 }27 28 int unite(int x,int y)29 {30 int rootx=find(x),rooty=find(y);31 if(rootx!=rooty)32 {pre[rootx]=pre[rooty];return 1;}33 return 0;34 }35 36 int main()37 {38 scanf("%d",&N);39 scanf("%d",&M);40 init();41 int x,y,ans=N;42 for(int i=1;i<=M;i++)43 {44 scanf("%d%d",&x,&y);45 ans-=unite(x,y);46 }47 printf("%d\n",ans-1);48 return 0;49 }
View Code

 

转载于:https://www.cnblogs.com/ACRykl/p/8068102.html

你可能感兴趣的文章
容器,类型转换。List。
查看>>
Hadoop 面试,有它就够了
查看>>
阿里云前端周刊 - 第 21 期
查看>>
React Native学习(二)---配置IDE
查看>>
Vue $nextTick 两种写法的差异
查看>>
传说中的git到底怎么搞?安装、文件修改管理等
查看>>
goreplay 使用教程
查看>>
Block
查看>>
for in,Object.keys,for of 的区别
查看>>
结构型设计模式之桥接模式
查看>>
深入理解nodejs Stream模块
查看>>
java版spring cloud+spring boot+redis多租户社交电子商务平台:服务消费(Feign)
查看>>
ios手机QQ无发改变title问题
查看>>
深入理解ES6 ---- 正则扩展
查看>>
activiti总结(一)流程图结构简介
查看>>
dom节点和vue中template浅谈
查看>>
第三方开源框架(一)
查看>>
JSONP跨域
查看>>
对js陀螺仪的认知理解
查看>>
react native scrollView定时器广告位
查看>>