kruskal算法-Pascal
马上就快要考试了,然而突然发现自己图论已经废了,于是再都打一遍练练手。。。。。。
const
maxn=;
maxe=maxn*maxn; type
edge=record //edge记录每一条边,a,b为它所连接的两个点,len为边长
a,b:longint;
len:longint;
end; var
edges:array[..maxe]of edge;
p,r:array[..maxn]of longint;
n,e:longint; procedure swap(a,b:integer);
begin
edges[]:=edges[a];
edges[a]:=edges[b];
edges[b]:=edges[];
end; procedure qsort(l,r:integer); //快排
var
i,j,mid,t:integer;
begin
mid:=edges[random(r-l+)+l].len;
i:=l; j:=r;
repeat
while edges[i]<mid do inc(i);
while edges[j]>mid do dec(j);
if i<=j then
begin
swap(i,j);
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if r>i then qsort(i,r);
end; procedure init; //输入
var
i:integer;
begin
assign(input,'g.in');
reset(input);
readln(n,e);
for i:= to e do
readln(edges[i].a,edges[i].b,edges[i].len);
for i:= to n do
p[i]:=i;
randomize;
end; function find(x:integer):integer; //并查集:查找x的祖先
begin
if x<>p[x] then p[x]:=find(p[x]);
exit(p[x]);
end; procedure union(a,b:longint); //并查集:合并a,b所在的集合
var
t:integer;
begin
a:=find(a);
b:=find(b);
if r[a]>r[b] then
begin
t:=a;
a:=b;
b:=t;
end;
if r[a]=r[b] then inc(r[a]);
p[a]:=b;
end; procedure kruskal; //kruskal算法
var
en:longint; //记录当前为第几条边
count:longint; //记录当前加入了几条边
tot:longint; //记录当前已加入边的边权和
begin
count:=;
en:=;
tot:=; //初始化
while count<n- do //当已加入的边数小于(n-)个时
begin
inc(en);
with edges[en]do
begin
if find(a)<>find(b) then //如果a,b不在同一集合内
begin
union(a,b); //合并a,b
writeln(a,'--',b,':',len);
inc(tot,len);
inc(count);
end;
end;
end;
end; begin //main
init;
qsort(,e); //根据边长大小进行快排
kruskal;
end.
kruskal算法-Pascal的更多相关文章
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 最小生成树的Kruskal算法实现
最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...
- 最小生成树——kruskal算法
kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...
- Kruskal算法(三)之 Java详解
前面分别通过C和C++实现了克鲁斯卡尔,本文介绍克鲁斯卡尔的Java实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的 ...
- Kruskal算法(二)之 C++详解
本章是克鲁斯卡尔算法的C++实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转 ...
- Kruskal算法(一)之 C语言详解
本章介绍克鲁斯卡尔算法.和以往一样,本文会先对克鲁斯卡尔算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3 ...
- 最小生成树问题---Prim算法与Kruskal算法实现(MATLAB语言实现)
2015-12-17晚,复习,甚是无聊,阅<复杂网络算法与应用>一书,得知最小生成树问题(Minimum spanning tree)问题.记之. 何为树:连通且不含圈的图称为树. 图T= ...
- 学习笔记之 prim算法和kruskal算法
~. 最近数据结构课讲到了prim算法,然而一直使用kruskal算法的我还不知prim的思想,实在是寝食难安,于此灯火通明之时写此随笔,以祭奠我睡过去的数 据结构课. 一,最小生成树之prim pr ...
随机推荐
- CF Drazil and Date (奇偶剪枝)
Drazil and Date time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Oracle分页查询语句的写法(转)
Oracle分页查询语句的写法(转) 分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的 ...
- html5 js os build
1.NodeJS6.6 install https://nodejs.org/en/ c:\nodejs>npm install -g grunt-cliC:\Users\police\Ap ...
- 学习28个HTML5特征、窍门和技术
当下,H5火热得不行,写下这篇文章,认真的认识下HTML5. HTML5最早应该是09年左右被提出,然而当时受浏览器兼容性的影响,一直没得到普遍应用,最近也是因为移动端的发展,带动HTML5. 回归正 ...
- 踩到两只“bug”
近期在修复ex和头儿的代码时,碰到两个特别点的bug,其实也不能称之为bug,非常简单的用法,稍不严谨点可能就出错了. 第一个是in_array,大家都知道功能是检查一个值是否在数组中,第三个参数传入 ...
- HTTP - 条件请求
当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求.这样的请求首部有五个,分别是 If-Modified-Since.If-Unm ...
- ASP连接ACCESS数据库
Set conn2 = Server.CreateObject("ADODB.Connection") conn2.Open "Provider=Microsoft.Je ...
- MVC 提交表单
public ActionResult UserLogin() { var UserName = Request["username"]; var Password = Reque ...
- String的几种初始化方法的区别
参考了: java中String的两种初始化方法 String a; String aa = ""; String aaa = "123"; String ...
- java访问webservice服务(二)
欢迎转载,出处http://www.cnblogs.com/shizhongtao/p/3433679.html 利用cxf的框架实现 import javax.xml.namespace.QName ...