1765: 算法7-9:最小生成树

原创 2015年07月10日 09:46:24

题目描述

最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个通信网。
可以用连通网来表示n个城市以及n个城市之间可能设置的通信线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。现在,需要选择一棵生成树,使总的耗费最小。这个问题就是构造连通网的最小代价生成树,简称最小生成树。一棵生成树的代价就是树上各边的代价之和。
而在常用的最小生成树构造算法中,普里姆(Prim)算法是一种非常常用的算法。以下是其算法的大致结构:
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法建立最小生成树,并输出最小生成树的代价。

输入

输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数,对于第i行的第j个整数,如果不为0,则表示第i个顶点和第j个顶点有直接连接且代价为相应的值,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图,且保证图中只有一个连通分量。

输出

只有一个整数,即最小生成树的总代价。请注意行尾输出换行。

样例输入

4
0 2 4 0
2 0 3 5
4 3 0 1
0 5 1 0

样例输出

6

提示

在本题中,需要掌握图的深度优先遍历的方法,并需要掌握无向图的连通性问题的本质。通过求出无向图的连通分量和对应的生成树,应该能够对图的连通性建立更加直观和清晰的概念。
program p1765;
var cost:array[1..50,1..50]of longint;
    mincost,closed:array[1..50]of longint;
    min,k,i,j,n,x,y,sum:longint;
begin
 readln(n);
 for i:=1 to n do
  for j:=1 to n do
   begin
    read(cost[i,j]);
    if(i<>j) and(cost[i,j]=0)then cost[i,j]:=maxint;
    end;
    sum:=0;
  for i:=1 to n do
   begin
    mincost[i]:=cost[1,i];
    closed[i]:=1;
   end;
 for i:=2 to n do
  begin
   min:=maxint;
   for j:=1 to n do
    if(mincost[j]<min)and(mincost[j]<>0)then
    begin
     min:=mincost[j];
     k:=j;
     end;
      sum:=sum+min;
    mincost[k]:=0;
    for j:=1 to n do
     if(mincost[j]>cost[k,j])and(mincost[j]<>0) then
    begin
     mincost[j]:=cost[k,j];
     closed[j]:=k;
     end;
   end;
 writeln(sum);
end.
版权声明:本文为博主原创文章,未经博主允许不得转载。

图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被...
  • allenhappy
  • allenhappy
  • 2013年11月30日 19:37
  • 856

图的最小生成树

题目描述 最小生成树问题是实际生产生活中十分重要的一类问题。假设需要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然需要考虑这样一个问题,即如何在最节省经费的前提下建立这个...
  • allenhappy
  • allenhappy
  • 2013年11月30日 19:45
  • 1074

最小生成树-MST算法详解及代码实现

最小生成树,贪心算法,Kruskal,Prim算法
  • coder_oyang
  • coder_oyang
  • 2015年09月03日 16:34
  • 4554

最小生成树的3个算法

最小生成树——Prim、Kruskal、Sollin(Boruvka)   本文内容框架: 1.Prim算法及其基于优先队列实现       2.Kruskal算法   ...
  • DJS_K_D
  • DJS_K_D
  • 2015年08月31日 11:16
  • 2147

最小生成树 《啊哈算法》读书笔记

最小生成树:任何只由G的边构成,并包含G的所有顶点的树称为G的生成树(G连通). 加权无向图G的生成树的代价是该生成树的所有边的代码(权)的和. 最小代价生成树是其所有生成树中代价最小的生成树。   ...
  • huatian5
  • huatian5
  • 2016年07月08日 14:18
  • 888

最小生成树算法汇总

较为完全的初学者学习最小生成树的利器,想要玩转ACM的小编倾情奉献
  • ltyqljhwcm
  • ltyqljhwcm
  • 2016年07月28日 15:38
  • 2268

最小生成树 Kruska算法

Kruskal算法的过程: (1) 将全部边按照权值由小到大排序。 (2) 按顺序(边权由小到大的顺序)考虑每条边,只要这条边和我们已经选择的边不构成圈,就保留这条边,否则放弃这条边。 算法 成功选择...
  • qqchanmingdexiaji
  • qqchanmingdexiaji
  • 2017年03月08日 14:35
  • 259

算法之详解最小生成树

算法之详解最小生成树 分类: Algorithms & Data Structure2012-05-01 00:20 9160人阅读 评论(31) 收藏 举报 算法algorith...
  • u014774781
  • u014774781
  • 2015年06月12日 20:02
  • 1764

带你辨析最小生成树的两种算法

最小生成树的算法通常由在几个城市中间修筑路径使其连通并且花费最小引出。如下图所示引例。 多数求最小生成树算法都应用了简称为MST的性质:假设N=(V,{E})是一个连通网,U是顶点V的一个非空子...
  • ydjcs567
  • ydjcs567
  • 2016年05月04日 20:04
  • 361

数据结构:最小生成树--Kruskal算法

Kruskal算法 求解最小生成树的另一种常见算法是Kruskal算法,它比Prim算法更直观。从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条边不能使已有...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月07日 11:45
  • 5128
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1765: 算法7-9:最小生成树
举报原因:
原因补充:

(最多只允许输入30个字)