最小生成树是将一个点阵联通所需要的最短的路径总长度。
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> using namespace std; inline int read() { int x=0,f=1; char ch; do { ch=getchar(); if(ch=='-') f=-1; }while(ch<'0'||ch>'9'); do { x=x*10+(ch-'0'); ch=getchar(); }while(ch>='0'&&ch<='0'); return x*f; } struct node { int a,b,c; }s[10000]; bool cmp(const node & x,const node & y){return x.c<y.c;}//根据路径的长度来排序 int f[10000]; int getf(int v)//寻找他们的祖先 { if(f[v]==v) return v;//自己是自己的祖先 else { f[v]==getf(f[v]);//找自己祖先的祖先 return f[v]; } } int main() { int n,m; n=read(); m=read(); int i,j,k; for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) { cin>>s[i].a>>s[i].b>>s[i].c; } sort(s+1,s+n+1,cmp); int ans=0; int cnt=0; for(i=1;i<=n;i++) { int h1,h2; h1=getf(s[i].a); h2=getf(s[i].b); if(h1!=h2)//如果不在一起,说明树还没有建好,就合并。 { ans+=s[i].c;//答案增加 cnt++;//路径数目增加 f[h2]=h1;//标记 } if(cnt==n-1) break;//N个点需要n-1条边 } cout<<ans; return 0; }
祝大家编程顺利。