kruskal最小生成树(Pascal版)

 1 const maxn=1050;maxm=100050;
 2 type
 3         edge=record
 4                 f,g,w:longint;
 5         end;
 6 var
 7         i,j,k,l,m,n,tot:longint;
 8         c:array[0..maxn] of longint;
 9         a:array[0..maxm] of edge;
10 function getfat(x:longint):longint;
11         begin
12                 if c[x]<>x then c[x]:=getfat(c[x]);
13                 exit(c[x]);
14         end;
15 operator <(e1,e2:edge)x:boolean;   //为了便于排序,重载运算符
16         begin
17                 x:=e1.w<e2.w;
18         end;
19 operator >(e1,e2:edge)x:boolean;
20         begin
21                 x:=e1.w>e2.w;
22         end;
23 procedure swap(var e1,e2:edge);
24         var e3:edge;
25         begin
26                 e3:=e1;e1:=e2;e2:=e3;
27         end;
28 procedure sort(l,r:longint);
29         var
30                 i,j:longint;
31                 x:edge;
32         begin
33                 i:=l;j:=r;x:=a[(l+r) div 2];
34                 repeat
35                         while a[i]<x do inc(i);
36                         while x<a[j] do dec(j);
37                         if i<=j then
38                                 begin
39                                         swap(a[i],a[j]);
40                                         inc(i);dec(j);
41                                 end;
42                 until i>j;
43                 if l<j then sort(l,j);
44                 if i<r then sort(i,r);
45         end;
46 function newedge(x,y,z:longint):edge;
47         var e1:edge;
48         begin
49                 e1.f:=x;e1.g:=y;e1.w:=z;
50                 exit(e1);
51         end;
52 begin
53         readln(n,m);
54         for i:=1 to n do c[i]:=i;
55         for i:=1 to m do
56                 begin
57                         readln(j,k,l);
58                         a[i]:=newedge(j,k,l);
59                 end;
60         sort(1,m);
61         j:=1;tot:=0;
62         for i:=1 to n-1 do
63                 begin
64                         repeat
65                                 k:=getfat(a[j].f);   //并查集判定
66                                 l:=getfat(a[j].g);
67                                 if k<>l then break;
68                                 inc(j);
69                         until j>m;
70                         if j>m then break;    //无法连通
71                         c[k]:=l;tot:=tot+a[j].w;
72                 end;
73         if j>m then writeln(-1) else writeln(tot);
74 end.
时间: 2024-10-09 05:33:38

kruskal最小生成树(Pascal版)的相关文章

Prim和Kruskal最小生成树

标题: Prim和Kruskal最小生成树时 限: 2000 ms内存限制: 15000 K总时限: 3000 ms描述: 给出一个矩阵,要求以矩阵方式单步输出生成过程.要求先输出Prim生成过程,再输出Kruskal,每个矩阵输出后换行.注意,题中矩阵表示无向图输入: 结点数矩阵输出: Prim:矩阵输出 Kruskal:矩阵输出输入样例: 3 0 1 3 1 0 2 3 2 0 输出样例: 3 0 1 3 1 0 2 3 2 0Prim: 0 0 0 0 0 0 0 0 0 0 1 0 1

贪心算法(2)-Kruskal最小生成树

什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边.最小生成树其实是最小权重生成树的简称.生成树的权重是考虑到了生成树的每条边的权重的总和. 最小生成树有几条边? 最小生成树有(V – 1)条边,其中V是给定的图的顶点数量. Kruskal算法 下面是步骤寻找MST使用Kruskal算法 1 1,按照所有边的权重

[算法系列之二十七]Kruskal最小生成树算法

简介 求最小生成树一共有两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法.在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树. 我们有一个带权值的图,我们要求找到一个所有生成树中具有最小权值的生成树.如下图所示,T是图G的生成树.但不是具有最小权值的生成树. 我们可以把他们想象成一组岛屿和连接它们的可能的桥梁.当然修桥是非常昂贵和费时的,所以我们必须要知道建设什么样的桥梁去连接各个岛.不过有一个重要的问题,建设这样一组连接所有岛屿的桥梁的最低价

Kruskal 最小生成树算法

对于一个给定的连通的无向图 G = (V, E),希望找到一个无回路的子集 T,T 是 E 的子集,它连接了所有的顶点,且其权值之和为最小. 因为 T 无回路且连接所有的顶点,所以它必然是一棵树,称为生成树(Spanning Tree),因为它生成了图 G.显然,由于树 T 连接了所有的顶点,所以树 T 有 V - 1 条边.一张图 G 可以有很多棵生成树,而把确定权值最小的树 T 的问题称为最小生成树问题(Minimum Spanning Tree).术语 "最小生成树" 实际上是

Kruskal最小生成树

%% matlab练习程序(Kruskal最小生成树)% Kruskal算法类似于连通分支算法,感觉和过去实现过的连通区域标记算法非常像.% 步骤:% 1.对于一个图,将图的每条边提取出来从小到大进行排序.% 2.将已排序的边依次加入到新图中,如果新图中出现了环,那么就舍弃这条边.% 3.不断重复第二步.% 下面两个图就是kruskal算法前后的样子. 注释:图中红色为最小生成树 clc;clear all;close all; G=[0 4 0 0 0 0 0 8 0;4 0 8 0 0 0

HDU 1162 Eddy&#39;s picture (最小生成树)(java版)

Eddy's picture 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 --每天在线,欢迎留言谈论. 题目大意: 给你N个点,求把这N个点连在一起的最短总距离. 思路: 假设每两两点之间都有路径,求最小生成树. AC代码:(Java) 1 import java.util.Scanner; 2 import java.math.*; 3 public class Main { 4 public static final int MAX

hdu 1875 最小生成树 prime版

最小生成树prime版 大致的步骤 首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24846    Accepted Submission(s): 8035 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不

HDU 1233 prim kruskal最小生成树模板题

A - 还是畅通工程 Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小.请计算最小的公路总长度. Input 测试输入包含若干测试

hdu1875 畅通工程再续 并查集+kruskal最小生成树

Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米.当然,为了节省资金,只要求实现任意2个小岛之间有路通即可.其中桥的价格为 100元/米.