最小生成树

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. (转载) 小议TCP的MSS(最大分段)以及MTU(最大传输单元)

    [背景知识]  MTU: Maximum Transmission Unit 最大传输单元 MSS: Maximum Segment Size 最大分段大小PPPoE: PPP Over Ethern ...

  2. Nginx配置Q&A

    隐藏响应头 How can remove Nginx from http response header? - Stack Overflow more_set_headers 'Server: my- ...

  3. vc++创建Win32 Application窗体过程

    #include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, W ...

  4. JS 样式叠加显示

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. JS 封装一个显示时间的函数

    s(); function s (){ var mydate=new Date(); var y = mydate.getFullYear(); var m = mydate.getMonth(); ...

  6. Teradata在大数据管理与分析领域连续18年评测排名第一

    Gartner 魔力象限介绍 Gartner(高德纳)全球最具权威的IT市场研究与顾问咨询公司,他总是不停地推出IT行业的各种报告以及著名的Gartner魔力象限. Gartner魔力象限通常从两个方 ...

  7. rm -fr删除不了文件

    向各位求教:一个阿里的 ecs服务器,放网站的.估计被挂马了,其中网站下的一个文件index.html,被篡改,想删除,但是删除不了. ls -l 结果:-r--r--r--  1 www  www  ...

  8. int rc = -EINVAL是什么意思

    rc应该是return code的意思,将函数返回值rc初始化为-EINVAL,EINVAL由POSIX.1规范中的一个宏,一般通过包含C标准头文件errno.h,表示参数无效(invalid arg ...

  9. 训练1-R

    给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 = ...

  10. [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 ...