洛谷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 算法