最小生成树II

来源:互联网 发布:linux设置文件权限命令 编辑:程序博客网 时间:2024/05/17 04:06

最小生成树II

Time Limit:10000MS  Memory Limit:65536K
Total Submit:275 Accepted:127
Case Time Limit:1000MS

Description

  农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了用最小的消费,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

Input

第一行: 农场的个数,N(3<=N<=5000)。
第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

Output

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

Sample Input

40 4 9 214 0 8 179 8 0 1621 17 16 0

Sample Output

28


a) 初始化:dis[v]=maxint(v∈V,v≠s);dis[s]=0; pre[s]=s; S={s};tot=0

b) Fori:=1 to n

1.取顶点v∈V-S使得W(u,v)=min{W(u,v)|u∈S,v∈V-S,(u,v)∈E}

2.S=S+{v};tot=tot+W(u,v);输出边(u,v)

3.ForV-S中每个顶点v do Relax(u,v,Wu,v)

c)       算法结束:tot为MST的总权值



  • const  maxn=5000;var  a:array[0..maxn,0..maxn] of longint;  v,d:array[0..maxn] of longint;  i,j,n,s:longint;procedure prim;var  i,j,k,min:longint;begin  for i:=1 to n do    d[i]:=a[1,i];  v[1]:=1;  for i:=1 to n-1 do    begin      min:=maxlongint;      for j:=1 to n do        if (v[j]=0) and (d[j]<min) then          begin            k:=j;            min:=d[j];          end;      v[k]:=1;      s:=s+min;      for j:=1 to n do        if (v[j]=0) and (a[k,j]<d[j]) and (a[k,j]<>0)          then d[j]:=a[k,j];    end;end;begin  readln(n);  for i:=1 to n do    for j:=1 to n do      read(a[i,j]);  prim;  writeln(s);end.

1 0