最小生成树模板
Kruskal
#include<bits/stdc++.h> using namespace std; int father[5005],ans; struct bian{ int data,l,r,c; }b[5005]; int getfather(int p){ if(father[p]==p) return p; return father[p]=getfather(father[p]); } void uni(int x,int y){ int fx=getfather(x); int fy=getfather(y); if(fx!=fy) father[fx]=fy; } bool cmp(const bian x,const bian y){ return x.data<y.data; } int main(){ int t=0,x,y,n,k; cin>>n>>k; for(int i=1;i<=k;i++){ scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].data); } for(int i=1;i<=n;i++){ father[i]=i; } sort(b+1,b+k+1,cmp); for(int j=1;j<=k;j++){ int sum=0; if(!b[j].c&&(getfather(b[j].l)!=getfather(b[j].r))){ uni(b[j].l,b[j].r); b[j].c=1; cout<<b[j].l<<"->"<<b[j].r<<endl; ans+=b[j].data; } } cout<<"ans="<<ans; }
Prim
#include<bits/stdc++.h> using namespace std; int b[5005],vis[5005],a[5005][5005],ans=0; int main(){ int n,k,x,y; cin>>n>>k; for(int i=1;i<=k;i++){ cin>>x>>y; cin>>a[x][y]; a[y][x]=a[x][y]; } k=1; for(int i=1;i<=n;i++){ if(a[i][k]) vis[i]=a[i][k]; else vis[i]=2147483647; } b[1]=1; for(int i=1;i<=n-1;i++){ int m=2147483647; cout<<k<<"->"; k=0; for(int j=1;j<=n;j++){ if(vis[j]<m&&vis[j]&&!b[j]){ m=vis[j]; b[j]=1; b[k]=0; k=j; } } cout<<k<<endl; ans+=m; vis[k]=0; for(int j=1;j<=n;j++){ if(vis[j]>a[j][k]&&a[j][k]&&!b[j]){ vis[j]=a[j][k]; } } } printf("%d",ans); return 0; }