博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

prim算法

Posted on 2010-10-17 10:54  深处的心扉  阅读(231)  评论(0)    收藏  举报

1 {prim算法的时间复杂度为O(n^2),并且与读入的图的边的条数无关,只与
2 结点数有关,故prim用于求稠密图}
3  program prim_example;
4 var
5 map:array[0..1000,0..1000]of longint; //记录要读入的邻接矩阵
6 dist:array[0..1000]of longint; //边权
7 d:array[0..1000]of 0..1; //加入的集合
8 i,j,n,m,min,ans,k:longint;
9
10 procedure prim;
11 begin
12 dist[1]:=0;
13 for i:=1 to n do
14 dist[i]:=map[1,i];
15 for i:=1 to n-1 do
16 begin
17 min:=maxlongint;
18 k:=0;
19 for j:=1 to n do
20 if (dist[j]<min)and(d[j]=0) then //dist[j]小于最小值并且该节点没在d集合中
21 begin
22 min:=dist[j];
23 k:=j;
24 end;
25 if k<>0 then //说明上步for循环中if语句执行
26 begin
27 inc(ans,min);
28 d[k]:=1; //将访问过的结点加入集合d
29 end;
30 for j:=1 to n do
31 if (map[k,j]<dist[j])and(d[j]<>1)then //寻求更短的路径
32 dist[j]:=map[k,j];
33 end;
34 end;
35
36 begin
37 assign(input,'input.txt');
38 reset(input);
39 assign(output,'output.txt');
40 rewrite(output);
41 readln(n);
42 for i:=1 to n do
43 for j:=1 to n do
44 begin
45 read(map[i,j]);
46 if (i<>j)and(map[i,j]=0) then
47 map[i,j]:=maxlongint; //初始化
48 end;
49 d[1]:=1;//从第一号结点开始查询
50 prim;
51 writeln(ans);
52 close(input);
53 close(output);
54 end.
55
56