最小生成树模板+并查集(隐藏)+结构体排序模板
minn[101],g[101][101],u[101]; memset(u,1,sizeof(u)); memset(minn,0x7f,sizeof(minn)); minn[1]=0; u[1]=0; i,j,k,m; total=0; for(i=1;i<=n;i++) { k=0; for(j=1;j<=n;j++) if(u[j]&&(minn[k]>minn[j])) k=j; u[k]=0; for(j=1;j<=n;j++) if(u[j]&&(g[k][j]<minn[j])) minn[j]=g[k][j]; } for(i=1;i<=n;i++) total+=minn[i]; cout<<total<<endl; /*prim*/ struct edge { int x,y,v; }a[1001]; int f[1001]; int find(int x) { if(find(x)==x)return x; f[x]=find(x); return f[x]; } unionn(int x,int y) { int fa=find(x); int fb=find(y); if(fa!=fb) f[fa]=fb; } int cmp(const edge &a,const edge &b) { if(a.v <b.v) return 1; else return 0; } //输入: cin>>n>>m; for(i=1;i<=m;i++) { cin>>fron>>to>>w; a[i].x=from; a[i].y=to; a[i].v=w; } //或者别的什么方式 //排序 sort(a,a+m+1); //核心代码 int sum=0,k=0; for(i=1;i<=m;i++) { int r1=find(a[i].x); int r2= find(a[i].y); if(r1!=r2) { sum+=a[i].v; k++; unionn(a[i].x,a[i].y); } if(k==n-1) break; } //输出 cout<<sum; /*Kruskal+并查集(隐)+结构体排序*/
我爱我自己!!!
我博客里有大量的从别的博客复制过来的代码,分析,以及理解,但我一律会在文章后面标记原博客大佬博客名,其中部分会加以连接。
绝无抄袭的意思,只是为了我在复习的时候找博客方便。
如有原作者对此有不满,请在博客留言,我一定会删除该博文。