最小生成树基础 (Kruskal)
Description
现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。
Input
输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1≤N,M≤1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。
Output
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。
Sample Input
4 3
9 12 4
7 8 56
32 32 43
21 12 12
2 3
34 56 56
12 23 4
Sample Output
82
74
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int field[][];
int abs(int x)
{
return x>?x:-x;
}
struct str
{
int x;
int y;
int cost;
}e[];
bool kong(str aa,str bb)//对sort的排序策略重新定义
{
return aa.cost<bb.cost;
}
int cnt,tot;//cnt代表边的个数,tot代表集合个数
int fa[];//并查集的father数组
int getfather(int v)
{
if(fa[v]==v)return v;
fa[v]=getfather(fa[v]);
return fa[v];
}
void merge(int x,int y)//把x合并到y的下面
{
int fx,fy;
fx=getfather(x);
fy=getfather(y);
fa[fx]=fy;
}
bool judge(int x,int y)
{
int fx,fy;
fx=getfather(x);
fy=getfather(y);
return (fx==fy);
}
int main()
{
int T;
scanf("%d",&T);
for(int tt=;tt<=T;tt++)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
scanf("%d",&field[i][j]);
fa[i*m+j]=i*m+j;
}
}
cnt=;tot=n*m;
for(int i=;i<n-;i++)
{
for(int j=;j<m-;j++)
{
e[++cnt].x=i*m+j;
e[cnt].y=(i+)*m+j;
e[cnt].cost=abs(field[i][j]-field[i+][j]);
e[++cnt].x=i*m+j;
e[cnt].y=(i)*m+j+;
e[cnt].cost=abs(field[i][j]-field[i][j+]);
}
}
for(int i=;i<n-;i++)
{
int j=m-;
e[++cnt].x=i*m+j;
e[cnt].y=(i+)*m+j;
e[cnt].cost=abs(field[i][j]-field[i+][j]);
}
for(int j=;j<m-;j++)
{
int i=n-;
e[++cnt].x=i*m+j;
e[cnt].y=(i)*m+j+;
e[cnt].cost=abs(field[i][j]-field[i][j+]);
}
sort(e+,e+cnt+,kong);
int sum=;
for(int i=;i<=cnt;i++)
{
if(tot==)break;
if(!judge(e[i].x,e[i].y))
{
sum+=e[i].cost;
tot--;
merge(e[i].x,e[i].y);
}
}
printf("Case #%d:\n%d\n",tt,sum);
}
return ;
}
最小生成树基础 (Kruskal)的更多相关文章
- 最小生成树的Kruskal算法实现
最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...
- 最小生成树之Kruskal
模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...
- ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法
主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 ...
- 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- 最小生成树 Prim Kruskal
layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...
- 数据结构与算法--最小生成树之Kruskal算法
数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...
- HDU 1598 find the most comfortable road(最小生成树之Kruskal)
题目链接: 传送门 find the most comfortable road Time Limit: 1000MS Memory Limit: 32768 K Description XX ...
- 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)
matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...
- 数据结构学习笔记05图(最小生成树 Prim Kruskal)
最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路 |V|个顶 ...
随机推荐
- (转载) 小议TCP的MSS(最大分段)以及MTU(最大传输单元)
[背景知识] MTU: Maximum Transmission Unit 最大传输单元 MSS: Maximum Segment Size 最大分段大小PPPoE: PPP Over Ethern ...
- Nginx配置Q&A
隐藏响应头 How can remove Nginx from http response header? - Stack Overflow more_set_headers 'Server: my- ...
- vc++创建Win32 Application窗体过程
#include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, W ...
- JS 样式叠加显示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JS 封装一个显示时间的函数
s(); function s (){ var mydate=new Date(); var y = mydate.getFullYear(); var m = mydate.getMonth(); ...
- Teradata在大数据管理与分析领域连续18年评测排名第一
Gartner 魔力象限介绍 Gartner(高德纳)全球最具权威的IT市场研究与顾问咨询公司,他总是不停地推出IT行业的各种报告以及著名的Gartner魔力象限. Gartner魔力象限通常从两个方 ...
- rm -fr删除不了文件
向各位求教:一个阿里的 ecs服务器,放网站的.估计被挂马了,其中网站下的一个文件index.html,被篡改,想删除,但是删除不了. ls -l 结果:-r--r--r-- 1 www www ...
- int rc = -EINVAL是什么意思
rc应该是return code的意思,将函数返回值rc初始化为-EINVAL,EINVAL由POSIX.1规范中的一个宏,一般通过包含C标准头文件errno.h,表示参数无效(invalid arg ...
- 训练1-R
给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 = ...
- [luogu3952 noip2017] 逛公园 (计数dp+最短路)
传送门 Description Input Output 输出文件包含 T 行,每行一个整数代表答案. Sample Input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 ...