【并查集】连接格点-C++
连接格点
描述
有一个M行N列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。
输入
第一行输入两个正整数m和n, 其中 1 <= n,m <= 1000。
以下若干行每行四个正整数x1,y1,x2,y2,表示第x1行第y1列的点和第x2行第y2列的点已经有连线。输入保证|x1-x2|+|y1-y2|=1。
输出
输出使得连通所有点还需要的最小花费。
输入样例 1
2 2
1 1 2 1
输出样例 1
3
这道题明显使用并查集来完成,但是需要把由(x,y)组成的坐标转成一个数字,所以就令点(x,y)为点(x-1)*m+y即可,其他的就是再普通不过的并查集来完成了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,d,ans;
int fa[1000000+10];
int convert(int x,int y)
{
return x*m+y-m;
}
void init()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int con=convert(i,j);
fa[con]=con;
}
}
}
int get(int x)
{
if(fa[x]==x)return x;
int r=get(fa[x]);
fa[x]=r;
return r;
}
bool merge(int x,int y)
{
int r1=get(x);
int r2=get(y);
if(r1==r2)return 0;
else fa[r1]=r2;
return 1;
}
int main()
{
cin>>n>>m;
init();
while(cin>>a>>b>>c>>d)
{
bool meiyong=merge(convert(a,b),convert(c,d));
}
for(int j=1;j<=m;j++)
{
for(int i=1;i+1<=n;i++)
{
if(merge(convert(i,j),convert(i+1,j)))
{
ans++;
}
}
}
for(int j=1;j<=m;j++)
{
for(int i=1;i+1<=n;i++)
{
if(merge(convert(i,j),convert(i,j+1)))
{
ans+=2;
}
}
}
cout<<ans<<endl;
return 0;
}
ov.
【并查集】连接格点-C++的更多相关文章
- POJ 1182 食物链 (拆点并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78601 Accepted: 23422 Description ...
- UVA 1493 Draw a Mess(并查集+set)
这题我一直觉得使用了set这个大杀器就可以很快的过了,但是网上居然有更好的解法,orz... 题意:给你一个最大200行50000列的墙,初始化上面没有颜色,接着在上面可能涂四种类型的形状(填充): ...
- HDU-1829 A Bug's Life。并查集构造,与POJ1709异曲同工!
A Bug's Life Find them, Catch them 都是并查集构造的题,不久前 ...
- D. Gourmet choice并查集,拓扑结构
D. Gourmet choice time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)
传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...
- codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)
题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...
- upc组队赛14 Communication【并查集+floyd /Tarjan】
Communication 题目描述 The Ministry of Communication has an extremely wonderful message system, designed ...
- Communication【floyd判环+并查集】
Communication 题目链接(点击) 题目描述 The Ministry of Communication has an extremely wonderful message system, ...
- poj2513连接木棍(字典树+欧拉回路+并查集)
题目传送门 题目大意:给你一堆木棍,每根木管都有两种颜色,相同颜色的部分可以连接起来,问你这堆木棍可不可以连接成1根. 思路:大致的思路很好想,就是判断欧拉回路的方法(1.联通,2,要么顶点读书全为偶 ...
随机推荐
- Android自定义View入门(一)
最近在写一个关于音乐播放的应用,写到播放界面UI时,就想自己实现的一个播放界面.那么如何实现自定义View呢?通过查看他人博客和Android官方开发文档,初步了解了一些浅显的内容.在此记录,已供需要 ...
- LINE_NO in format of XXXX example -> Line 10 is 0010
select case when length(line_no) = 1 then to_char(line_no) when length(line_no) = 2 then '00' || lin ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Wiki上的C++哲学
Philosophy[edit] Throughout C++'s life, its development and evolution has been informally governed b ...
- 关于CEdit控件的透明(重绘)
摘自:http://www.jcwcn.com/html/VC/10_19_51_12.htm 做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠 ...
- 修改zookeeper jvm参数
在zkServer.sh中,增加以下参数: start) echo -n "Starting zookeeper ... " if [ -f $ZOOPIDFILE ...
- Python连载10-os包函数(续)
一.os包(接连载9) 1.函数:system() (1)用法:运行系统shell命令 (2)格式:os.system(系统命令) (3)返回值:打开一个shell或终端界面 (4)注意:一般是用su ...
- Python 爬虫从入门到进阶之路(九)
之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...
- 【hadoop+spark】搭建spark过程
部分转载,已标红源地址,本博客为本菜搭建与爬坑记录,整理版请看: https://blog.csdn.net/the_fool_/article/details/78211166 记录: ====== ...
- ph模拟登录获取信息
cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...