Prim

声明

 

  洛谷P3366:https://www.luogu.org/problem/show?pid=3366

 

  所需知识:贪心、前向星(领接链表)。(未学过的请先学习相关算法)

 

  什么,你不知道最小生成树?那就戳这里吧!!! (额好吧有点绕,但能讲懂)

 

  算法较简单,不多解释,实在不会的看注释、看书、找资料~~

var
        v,d,first,next,en,len:array[0..1000001] of longint;
        n,m,i,x,y,w,ans,j,k,min,tot,now,e:longint;
procedure add(x,y,w:longint);
begin
        inc(tot);
        next[tot]:=first[x];
        first[x]:=tot;
        en[tot]:=y;
        len[tot]:=w;
end;
begin
        readln(n,m);
        for i:=1 to m do
        begin
                readln(x,y,w);
                add(x,y,w);
                add(y,x,w);
        end;
        for i:=1 to n do
                d[i]:=maxlongint div 2;
        d[1]:=0;
        for i:=1 to n do
        begin
                min:=maxlongint div 2;
                for j:=1 to n do
                        if (v[j]=0) and (min>d[j]) then
                        begin
                                min:=d[j];
                                k:=j;
                        end;
                v[k]:=1;
                ans:=ans+d[k];
                now:=first[k];
                while now<>0 do
                begin
                        e:=en[now];
                        if (v[e]=0) and (d[e]>len[now]) then d[e]:=len[now];
                        now:=next[now];
                end;
        end;
        if ans=0 then writeln('orz') else writeln(ans);
end.

 


   

   这里推荐一个博客,思路讲得挺详细的(虽然代码是 C 语言看不懂,但方法和思路值得借鉴!),也有讲后续优化方法,要看的话请移步!!!(本人比较懒,实在不想打思路、过程和注释什么的~~~)

 

   另外介绍另一种最小生成树算法: Kruskal 算法

 

posted @ 2018-10-05 21:29  》落雨~·~情缘《  阅读(138)  评论(0编辑  收藏  举报