HDU 5253 最小生成树(kruskal)+ 并查集
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 1000010
using namespace std;
struct node
{
int a;//端点1
int b;//端点2
int num;//权值
};
bool cmp(node x,node y)//按权值升序
{
return x.num<y.num;
}
int maps[1003][1003];
node edge[N*2];//边数=2mn-m-n<2mn
int father[N];
int r[N];
int finds(int x)
{
if(father[x]!=x)
father[x]=finds(father[x]);
return father[x];
}
void connect(int a,int b)
{
if(r[a]>r[b])
father[b]=a;
else if(r[a]<r[b])
father[a]=b;
else
{
father[a]=b;
r[b]++;
}
}
int main()
{
int T,cas=1,n,m,ans,id;
int i,j;
scanf("%d",&T);
while(T--)
{
int numedge=0;//边数
ans=0;
memset(r,0,sizeof(r));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&maps[i][j]);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
id=(i-1)*m+j;
father[id]=id;
if(i<n)//除最后一行外
{
numedge++;
edge[numedge].a=id;
edge[numedge].b=i*m+j;
edge[numedge].num=abs(maps[i][j]-maps[i+1][j]);
}
if(j<m)//除最后一列外
{
numedge++;
edge[numedge].a=id;
edge[numedge].b=(i-1)*m+j+1;
edge[numedge].num=abs(maps[i][j]-maps[i][j+1]);
}
}
}
sort(edge+1,edge+numedge+1,cmp);//权值排序
for(i=1;i<=numedge;i++)
{
int x=finds(edge[i].a);
int y=finds(edge[i].b);
if(x!=y)
{
connect(x,y);
ans+=edge[i].num;
}
}
printf("Case #%d:\n%d\n",cas++,ans);
}
return 0;
}
HDU 5253 最小生成树(kruskal)+ 并查集的更多相关文章
- Minimum Spanning Tree.prim/kruskal(并查集)
开始了最小生成树,以简单应用为例hoj1323,1232(求连通分支数,直接并查集即可) prim(n*n) 一般用于稠密图,而Kruskal(m*log(m))用于系稀疏图 #include< ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- TOJ 2815 Connect them (kruskal+并查集)
描述 You have n computers numbered from 1 to n and you want to connect them to make a small local area ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)
题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...
- hdu 1863 畅通工程 (并查集+最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others) M ...
- POJ 3723 Conscription (Kruskal并查集求最小生成树)
Conscription Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14661 Accepted: 5102 Des ...
- hdu 3938 Portal(并查集+离线+kruskal)2011 Multi-University Training Contest 10
搜了题解才把题搞明白.明白之后发现其实题意很清晰,解题思路也很清晰,只是题目表述的很不清晰…… 大意如下—— 给你一个无向图,图中任意两点的距离是两点间所有路径上的某一条边,这条边需要满足两个条件:1 ...
- hdu 1863 畅通工程(Kruskal+并查集)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- [CF891C] Envy - Kruskal,并查集
给出一个 n 个点 m条边的无向图,每条边有边权,共 Q次询问,每次给出 \(k\)条边,问这些边能否同时在一棵最小生成树上. Solution 所有最小生成树中某权值的边的数量是一定的 加完小于某权 ...
随机推荐
- ECC中的CRM UI端摆弄
前段时间想搞CRM了,可是公司没有环境,就去ECC直接试试事务码,结果竟然可以打开网页...兴奋之余又去看了一下CRM里的一些CLASS,结果很多都是没有的.沮丧! 后来想想,只能用UI的框架,挂WD ...
- Hadoop常见错误及处理方法
1.Hadoop-root-datanode-master.log 中有如下错误: ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: jav ...
- c#中的反射
System.Reflection.AssemblySystem.Activator Assembly assembly = Assembly.load("namespace名") ...
- python——使用readline库实现tab自动补全
Input History readline tracks the input history automatically. There are two different sets of funct ...
- PHP 页面编码声明方法详解(header或meta)
php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...
- cl.exe
http://blog.csdn.net/happyanger6/article/details/7589016
- outlook 用宏发邮件
经常发面试邮件,通常只是修改一下收件人邮箱地址,和收件人姓名,其他全部一致,有木有发现每次都用用outlook写邮件很麻烦? 使用宏发邮件,就会不麻烦了,直接修改下称呼,修改下收件人地址,按下F5,就 ...
- C#压缩图片1
using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;us ...
- P142-1
P142-1.1 登录页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 北邮新生排位赛1解题报告a-c
<div class="page-header" style="padding-bottom: 9px; margin: 20px 0px 30px; border ...