Prim笔记

概念

在一给定的无向图G=(V,E)G = (V, E)中,(u,v)(u, v)代表连接顶点 u 与顶点 v 的边,w(u, v) 代表此边的权重,若存在TTEE的子集且不存在循环,使得的w(T)w(T)最小,则此TTGG的最小生成树。

核心思想

通过每次寻找最短的与已标记的点有关联的边,不断更新直至最小权重生成树组成,
需要注意的是初始化,每一个初始化都至关重要。

代码

二话不说上代码?

Var n,i,j,tot,min,p,t:longint;
    w:array[1..305,1..305] of longint;
    flag:array[1..305] of boolean;
Begin
        read(n);
        for i:=1 to n do
        Begin
                for j:=1 to n do
                Begin
                        read(w[i,j]);
                        if w[i,j]=0 then w[i,j]:=maxint;
                end;
        end;

        flag[1]:=true;
        t:=1;
        while t<n do
        Begin
                min:=maxint;
                p:=0;
                for i:=1 to n do
                Begin
                        if flag[i] then
                        Begin
                                for j:=1 to n do
                                Begin
                                        if not flag[j] then
                                        Begin
                                                if w[i,j]<min then
                                                Begin
                                                        min:=w[i,j];
                                                        p:=j;
                                                end;
                                        end;
                                end;
                        end;
                end;

                if p<>0 then
                Begin
                        flag[p]:=true;
                        t:=t+1;
                        tot:=tot+min;
                end;
        end;

        write(tot);
end.

PS:兴致一来就写了,希望能为某些朋友提供帮助吧

posted @ 2019-07-06 21:57  willbe233  阅读(33)  评论(0)    收藏  举报