最小生成树笔记
Kruskal
1 //用并查集实现 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 struct edge{ 9 int u,v,w; 10 }a[10001]; 11 bool cmp(edge e1,edge e2){ 12 return e1.w<e2.w; 13 } 14 int fu,fv,n,m,u,v,w,tot=0,ans=0,fa[10001]; 15 int ff(int u){ 16 return fa[u]==u?fa[u]:ff(fa[u]); 17 } 18 void add(int u,int v,int w){ 19 a[++tot].u=u; 20 a[tot].v=v; 21 a[tot].w=w; 22 } 23 int main(){ 24 scanf("%d%d",&n,&m); 25 for(int i=1;i<=m;i++){ 26 scanf("%d%d%d",&u,&v,&w); 27 add(u,v,w); 28 } 29 for(int i=1;i<=n;i++){ 30 fa[i]=i; 31 } 32 sort(a+1,a+n+1,cmp); 33 for(int i=1;i<=m;i++){ 34 fu=ff(a[i].u); 35 fv=ff(a[i].v); 36 if(fu!=fv){ 37 ans+=a[i].w; 38 fa[fu]=fv; 39 } 40 } 41 printf("%d",ans); 42 return 0; 43 }
Prim
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 int n,m,u,v,w,minn,minx,ans=0,map[1001][1001],mst[100001],lc[100001]; 6 using namespace std; 7 void prim(){ 8 for(int i=2;i<=n;i++){ 9 lc[i]=map[1][i]; 10 mst[i]=1; 11 } 12 mst[1]=0; 13 for(int i=2;i<=n;i++){ 14 minn=2147483647; 15 for(int j=2;j<=n;j++){ 16 if(lc[j]<minn&&lc[j]!=0){ 17 minn=lc[j]; 18 minx=j; 19 } 20 } 21 ans+=minn; 22 lc[minx]=0; 23 for(int j=2;j<=n;j++){ 24 if(map[minx][j]<lc[j]){ 25 lc[j]=map[minx][j]; 26 mst[j]=minx; 27 } 28 } 29 } 30 } 31 int main(){ 32 memset(map,0x7f,sizeof(map)); 33 scanf("%d%d",&n,&m); 34 for(int i=1;i<=m;i++){ 35 scanf("%d%d%d",&u,&v,&w); 36 map[u][v]=w; 37 map[v][u]=w; 38 } 39 prim(); 40 printf("%d",ans); 41 return 0; 42 } 43 /* 44 6 10 45 1 2 6 46 1 3 1 47 1 4 5 48 2 3 5 49 2 5 3 50 3 4 5 51 3 5 6 52 3 6 4 53 4 6 2 54 5 6 6 55 */