利用并查集+贪心解决 Hdu1232
畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29620 Accepted Submission(s): 15557
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Hint
Huge input, scanf is recommended.
分析:对于不同的道路和不同的城镇,很容易想到是图的连通问题,所谓并查集,合并后,进行查找,主要说一下查找函数,请看
return set[x]=(set[x]==x?x:find(set[x]));
}
必须得有多少条边呢? 应该是N-1,然后再根据并查集,连一对边就减1,最后
连完也就出来答案了.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> int N,M;//n代表点,m代表边
int set[1005];
int temp; int find(int x)
{ return set[x]=(set[x]==x?x:find(set[x])); }
void merge(int a,int b) //合并
{ for(int i=1;i<=N;i++) { int x=find(a),y=find(b); if(x!=y) { set[x]=y; temp--; //找到后就减1} }
} int main()
{ while(scanf("%d%d",&N,&M),N!=0) { int a,b; temp=N-1; for(int j=1;j<=N;j++) { set[j]=j; } for(int i=1;i<=M;i++) { scanf("%d%d",&a,&b); merge(a,b); } printf("%d\n",temp); } return 0;
}
利用少量的贪心:代码如下:
#include<stdio.h>
int bin[1002];
int findx(int x)
{int r=x;while(bin[r]!=r)r=bin[r];return r;
}
void merge(int x,int y)
{int fx,fy;fx=findx(x);fy=findx(y);if(fx!=fy)bin[fx]=fy;
}
int main()
{int i,n,m,x,y,count;while(scanf("%d",&n),n){for(i=1;i<=n;i++)bin[i]=i;for(scanf("%d",&m);m>0;m--){scanf("%d %d",&x,&y);merge(x,y);}for(count=-1,i=1;i<=n;i++)if(bin[i]==i)count++;printf("%d\n",count);}
}
利用并查集+贪心解决 Hdu1232相关推荐
- 码说 | 并查集(以HDU1232为例)
码说 | 并查集(以HDU1232为例) 欢迎大家关注Zane's平行光工作坊 并查集 题目如下 题意概括 解题思路 并查方法 具体代码 题毕 欢迎大家关注Zane's平行光工作坊 这是Zane第一次 ...
- 利用并查集判断一个无向图是否成树
hdu 1272 利用并查集方法,找到各点的根节点. 几点注意: 一.树:1.无环 2.根节点入度为0,其余入度为1 判断依据: 1.若两个点的根节点相同(这两个点是父子关系),则形成环. 2.若所有 ...
- CF 1253D-Harmonious Graph-并查集+贪心
Description You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to ...
- 食物链 (利用并查集的两种解决方法)
食物链是并查集中的一道经典题, 第一次看<挑战程序设计竞赛>上懵懵懂懂, 最近又看见了发现还是一脸懵逼. 首先题目如下 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形 ...
- 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树
目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...
- java并查集找朋友圈_图—并查集(解决朋友圈问题)
图也是一种 非线性结构,是由多个顶点组成的关系集合组成的一种数据结构.图可以分为两种,无向图和有向图. ★图的定义: ★典型问题: 利用图能够解决很多问题,这里有一个较为典型的问题,假如已知有n个人和 ...
- 洛谷 P1967货车运输 并查集+贪心 不需要用LCA!
题目链接 题目链接 题解 要求所有的路径中最小边长的最大值! 我们贪心的加边,依照边从大往小的方式往里添加,然后合并并查集. 每次当查询分布在两个待合并的并查集的时候,当前的边长就是这次查询的答案. ...
- nssl1454-最短路【并查集,贪心】
正题 题目大意 nnn个点,每个点可以走到[ai,n][a_i,n][ai,n],每个点可以从[bi,n][b_i,n][bi,n]到达. 求disi,j∗(i+j)dis_{i,j}*(i+j) ...
- HDOJ 1598 find the most comfortable road(并查集+贪心)
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 单链表式并查集应用(解决区间合并,区间删除,染色问题)
单链表式并查集应用 普通并查集(树状): p[i]p[i]p[i] 表示节点 iii 的父节点, iii 所在树的根节点是代表元素. 单链表式并查集(单链表状)时间复杂度 O(m元素值域+n)O(m_ ...
最新文章
- 深入理解 wpa_supplicant(二)
- .net2.0下数据库连接字符串的使用
- Mac OS X下Maven的安装与配置
- linux启动tomcat不停的触发gc,tomcat的rmi触发的full gc的时间过长的优化
- java判断时间是不是星期五_Java判断当前日期是星期几
- javascript 学习笔记之面向对象编程(二):继承多态
- ccBPM典型的树形表单和多表头表单的流程示例
- Leetcode刷题实战(1):Two Sum
- linux下nmap工具的使用
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
- jieba库分词词频统计
- STP/RSTP/MSTP经典分析与对比
- leip与mysql数据库_性能分析方法 - osc_xm8bu282的个人空间 - OSCHINA - 中文开源技术交流社区...
- 电脑c盘满了怎么清理
- 图像变换——分段线性变换
- 计算机二级数据模拟表,2020年计算机二级《Access数据库程序设计》模拟题(5)...
- 扫描仪共享工具(BlindScanner Pro) 3.23 特别版
- 互联网公司的“江湖绰号”盘点,你知道几个?
- rank over pation
- 获取Google PR值的代码!