kruskal算法-Pascal

马上就快要考试了,然而突然发现自己图论已经废了,于是再都打一遍练练手。。。。。。

  1 const
  2     maxn=100;
  3     maxe=maxn*maxn;
  4
  5 type
  6     edge=record                            //edge记录每一条边,a,b为它所连接的两个点,len为边长
  7             a,b:longint;
  8             len:longint;
  9         end;
 10
 11 var
 12     edges:array[0..maxe]of edge;
 13     p,r:array[0..maxn]of longint;
 14     n,e:longint;
 15
 16 procedure swap(a,b:integer);
 17     begin
 18         edges[0]:=edges[a];
 19         edges[a]:=edges[b];
 20         edges[b]:=edges[0];
 21     end;
 22
 23 procedure qsort(l,r:integer);                    //快排
 24     var
 25         i,j,mid,t:integer;
 26     begin
 27         mid:=edges[random(r-l+1)+l].len;
 28         i:=l; j:=r;
 29         repeat
 30             while edges[i]<mid do inc(i);
 31             while edges[j]>mid do dec(j);
 32             if i<=j then
 33                 begin
 34                     swap(i,j);
 35                     inc(i);
 36                     dec(j);
 37                 end;
 38          until i>j;
 39         if l<j then qsort(l,j);
 40         if r>i then qsort(i,r);
 41     end;
 42
 43 procedure init;                                                //输入
 44     var
 45         i:integer;
 46     begin
 47         assign(input,‘g.in‘);
 48         reset(input);
 49         readln(n,e);
 50         for i:=1 to e do
 51             readln(edges[i].a,edges[i].b,edges[i].len);
 52         for i:=1 to n do
 53             p[i]:=i;
 54         randomize;
 55     end;
 56
 57 function find(x:integer):integer;              //并查集:查找x的祖先
 58     begin
 59         if x<>p[x] then p[x]:=find(p[x]);
 60         exit(p[x]);
 61     end;
 62
 63 procedure union(a,b:longint);                            //并查集:合并a,b所在的集合
 64     var
 65         t:integer;
 66     begin
 67         a:=find(a);
 68         b:=find(b);
 69         if r[a]>r[b] then
 70             begin
 71                 t:=a;
 72                 a:=b;
 73                 b:=t;
 74             end;
 75         if r[a]=r[b] then inc(r[a]);
 76         p[a]:=b;
 77     end;
 78
 79 procedure kruskal;                                //kruskal算法
 80     var
 81         en:longint;                //记录当前为第几条边
 82         count:longint;        //记录当前加入了几条边
 83         tot:longint;            //记录当前已加入边的边权和
 84     begin
 85         count:=0;
 86         en:=0;
 87         tot:=0;                //初始化
 88         while count<n-1 do                //当已加入的边数小于(n-1)个时
 89             begin
 90                 inc(en);
 91                 with edges[en]do
 92                     begin
 93                         if find(a)<>find(b) then        //如果a,b不在同一集合内
 94                             begin
 95                                 union(a,b);            //合并a,b
 96                                 writeln(a,‘--‘,b,‘:‘,len);
 97                                 inc(tot,len);
 98                                 inc(count);
 99                             end;
100                     end;
101             end;
102     end;
103
104 begin                //main
105     init;
106     qsort(1,e);        //根据边长大小进行快排
107     kruskal;
108 end.
时间: 2024-08-03 07:42:18

kruskal算法-Pascal的相关文章

HDU 1389 继续畅通工程【最小生成树,Prime算法+Kruskal算法】

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21871    Accepted Submission(s): 9356 Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列

hdu 1875 畅通工程再续(kruskal算法计算最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18411    Accepted Submission(s): 5769 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

ZOJ1372 POJ 1287 Networking 网络设计 Kruskal算法

题目链接:ZOJ1372 POJ 1287 Networking 网络设计 Networking Time Limit: 2 Seconds      Memory Limit: 65536 KB You are assigned to design network connections between certain points in a wide area. You are given a set of points in the area, and a set of possible

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

POJ 2421 Constructing Roads 修建道路 最小生成树 Kruskal算法

题目链接:POJ 2421 Constructing Roads 修建道路 Constructing Roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19698   Accepted: 8221 Description There are N villages, which are numbered from 1 to N, and you should build some roads such that e

最小生成树之Kruskal算法

上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法的步骤: a.假定拓扑图的边的集合是E,初始化最小生成树边集合G={}. b. 遍历集合E中的所有元素,并且按照权值的大小进行排序. c. 找出E中权值最小的边e . d .如果边e不和最小生成树集合G中的边构成环路,则将边e加到边集合G中:否则测试下一条权值次小的边,直到满足条件为止. e. 重复

Prim算法和Kruskal算法求最小生成树

Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小生成树中一定有n-1条边. Prim算法需要两个线性表来进行辅助: visited: 标记已经加入生成树的顶点:(它的功能可以由tree取代) 初始状态:生成树根节点为真,其它为0. tree: 记录生成树,tree[x]保存顶点x的直接根节点下标,若x为树的根节点则tree[x]为其自身. 初始状

kruskal算法求最小生成树(jungle roads的kruskal解法)

注意: 注意数组越界问题(提交出现runtimeError代表数组越界) 刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越界问题,以后需要注意啦. Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads betwe

POJ 1797 kruskal 算法

题目链接:http://poj.org/problem?id=1797 开始题意理解错.不说题意了. 并不想做这个题,主要是想测试kruskal 模板和花式并查集的正确性. 已AC: /* 最小生成树 kruskal算法 过程:每次选取没有参与构造最小生成树并且加入之后不会构成回路的边中权值最小的一条 作为最小生成树的一条新边.直至选择了V-1条边. */ #include <stdio.h> #include <string.h> #include <iostream>