最小生成树(两种方法)
嗯,最近时间有点紧
以后有空再配解析
代码来了
↓↓↓
#include<bits/stdc++.h> using namespace std; int n,m,i,j,k,x,y,z; int a[5050][5050]; bool u[5050]; int f[5050]; int main() { cin>>n>>m; memset(f,0x7f,sizeof(f)); memset(a,0x7f,sizeof(a)); for(i=1;i<=m;i++) { cin>>x>>y>>z; a[x][y]=min(z,a[x][y]); a[y][x]=min(z,a[y][x]); } f[1]=0; for(i=2;i<=n;i++) { int minn=1e9,k; for(j=1;j<=n;j++) { if(!u[j]&&f[j]<minn) { minn=f[j]; k=j; } } if(minn==1e9) { cout<<"orz"; return 0; } u[k]=true; for(j=1;j<=n;j++) if(!u[j]) f[j]=min(f[j],a[k][j]); } int ans=0; for(i=1;i<=n;i++) ans+=f[i]; cout<<ans; return 0; }
(个人喜欢这个)
#include<bits/stdc++.h> using namespace std; int n,m,i,j,k,x,y,z; int f[5050],ans; struct tree{ int x,y,z; }a[200050]; bool cmp(tree a,tree b) { return a.z<b.z; } int find(int x)//路径压缩版 { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } void unionn(int x,int y) { int r1=find(x); int r2=find(y); f[r1]=r2; } int main() { cin>>n>>m; for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) { cin>>x>>y>>z; a[i].x=x; a[i].y=y; a[i].z=z; } sort(a+1,a+1+m,cmp); k=0; for(i=1;i<=m;i++) { if(find(a[i].x)!=find(a[i].y)) { unionn(a[i].x,a[i].y); ans+=a[i].z; k++; } if(k==n-1) break; } if(k!=n-1) { cout<<"orz"; return 0; } cout<<ans; return 0; }