最小生成树

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。

现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。

 

Input

第一行输入一个数字T(T≤10),代表输入的样例组数

输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1≤N,M≤1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。 

 

Output

对于每组测试数据输出两行:

第一行输出:"Case #i:"。i代表第i组测试数据。

第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。

 

Sample Input

2
4 3
9 12 4
7 8 56
32 32 43
21 12 12
2 3
34 56 56
12 23 4
 

Sample Output

Case #1:
82
Case #2:
74
 
//裸的最小生成树,正在学习map的用法,没写完。。。
上面的话当我没说,我时间复杂度估计错了,直接快排复杂度和二叉树存储的复杂度是一样的。。。。
裸的最小生成树,因为是稀疏图,用kruskal算法,核心思路就是捡权值小的边用,两边的端点如果不属于同一个集合就合并,直到所有的点都被合并了,这里用到了并查集。
 #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)的更多相关文章

  1. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  2. 最小生成树之Kruskal

    模板题,学习一下最小生成树的Kruskal算法 对于一个连通网(连通带权图,假定每条边上的权均为大于零的实数)来说,每棵树的权(即树中所有边的权值总和)也可能不同 具有权最小的生成树称为最小生成树 生 ...

  3. ZOJ 1203 Swordfish 旗鱼 最小生成树,Kruskal算法

    主题链接:problemId=203" target="_blank">ZOJ 1203 Swordfish 旗鱼 Swordfish Time Limit: 2 ...

  4. 经典问题----最小生成树(kruskal克鲁斯卡尔贪心算法)

    题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...

  5. 最小生成树 Prim Kruskal

    layout: post title: 最小生成树 Prim Kruskal date: 2017-04-29 tag: 数据结构和算法 --- 目录 TOC {:toc} 最小生成树Minimum ...

  6. 数据结构与算法--最小生成树之Kruskal算法

    数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...

  7. HDU 1598 find the most comfortable road(最小生成树之Kruskal)

    题目链接: 传送门 find the most comfortable road Time Limit: 1000MS     Memory Limit: 32768 K Description XX ...

  8. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  9. 数据结构学习笔记05图(最小生成树 Prim Kruskal)

    最小生成树Minimum Spanning Tree 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 树: 无回路   |V|个顶 ...

随机推荐

  1. A - Boy or Girl(set)

    Problem description Those days, many boys use beautiful girls' photos as avatars in forums. So it is ...

  2. MD5三种方法的学习总结

    MD5百度百科 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已 ...

  3. centos6.6--------反向DNS配置

    一.反向区: 将域名解析为IP====================================================================================注 ...

  4. 文档控件NTKO OFFICE 详细使用说明之预览word编辑保存回服务器

    1.在线预览Word文件 (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将www.ntko.com加入到浏览 ...

  5. The AJAX response: XML, HTML, or JSON?

    shared from: http://www.quirksmode.org/blog/archives/2005/12/the_ajax_respon.html 1. 返回XML文档 对返回的XML ...

  6. python安装Django需要环境

    Django==1.10.3 -e git+https://github.com/duoshuo/duoshuo-python-sdk.git#egg=duoshuo-python-sdk djang ...

  7. 腾讯云TrustAsia DV SSL CA证书的申请及使用

    1.证书申请及管理     对于已经拥有域名及公网服务器的用户,可以通过腾讯云申请TrustAsia DV SSL CA证书,证书申请流程包含填写基本信息和域名认证两步,非常清晰和简单,没有什么需要过 ...

  8. [Intermediate Algorithm] - Sum All Primes

    题目 求小于等于给定数值的质数之和. 只有 1 和它本身两个约数的数叫质数.例如,2 是质数,因为它只能被 1 和 2 整除.1 不是质数,因为它只能被自身整除. 给定的数不一定是质数. 提示 For ...

  9. Lazy Initialization with Swift

    Lazy initialization (also sometimes called lazy instantiation, or lazy loading) is a technique for d ...

  10. 【JS】【30】各种正则

    前言: 0,基本规则:有点枯燥,可以参考下 正则表达式 – 教程 | 菜鸟教程 http://www.runoob.com/regexp/regexp-tutorial.html 1,校验手机号 2, ...