8/5 Kruskal
基础代码如下
struct edge{ int u,v,w; }e[305*305]; bool cmp(edge x,edge y){ return x.w<y.w; }//对w排序 void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; }//并查集判断环 int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)){ s++; k[s]=e[i].w; kk--; if(kk==1){ return ans; }//如果查完返回,就是最小值 } } return 0; }
eg1【提高】最优布线问题
#include<bits/stdc++.h> using namespace std; const int N=100; int fa[N]; int n,m; int a[1005][1005]; struct edge{ int u,v,w; }e[N*N]; bool cmp(edge x,edge y){ return x.w<y.w; } void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; } int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)){ ans+=e[i].w; kk--; if(kk==1){ return ans; } } } return 0; } int main(){ cin>>n; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ cin>>a[i][j]; } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ m++; e[m].u=i; e[m].v=j; e[m].w=a[i][j]; } } Init(n); cout<<kru(n)<<endl; return 0; }
eg2最短网络
#include<bits/stdc++.h> using namespace std; const int N=100; int fa[N]; int n,m; int a[1005][1005]; struct edge{ int u,v,w; }e[N*N]; bool cmp(edge x,edge y){ return x.w<y.w; } void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; } int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)){ ans+=e[i].w; kk--; if(kk==1){ return ans; } } } return 0; } int main(){ cin>>n>>m; for(int i=1; i<=m; i++){ for(int j=1; j<=n; j++){ cin>>a[i][j]; } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ e[m].u=i; e[m].v=j; e[m].w=a[i][j]; } } Init(n); cout<<kru(n)<<endl; return 0; }
eg3局域网
#include<bits/stdc++.h> using namespace std; const int N=100; int fa[N]; int n,m; int a[1005][1005]; struct edge{ int u,v,w; }e[N*N]; bool cmp(edge x,edge y){ return x.w<y.w; } void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; } int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)){ ans+=e[i].w; kk--; if(kk==1){ return ans; } } } return 0; } int main(){ int s=0; cin>>n>>m; for(int i=1; i<=m; i++){ int aa,bb,cc; cin>>aa>>bb>>cc; e[i].u=aa; e[i].v=bb; e[i].w=cc; s+=cc; } Init(n); cout<<s-kru(n)<<endl; return 0; }
eg4繁忙的都市
#include<bits/stdc++.h> using namespace std; int fa[305]; int n,m; int a[305][305]; int s=0; int k[10005]; struct edge{ int u,v,w; }e[305*305]; bool cmp(edge x,edge y){ return x.w<y.w; } void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; } int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)){ s++; k[s]=e[i].w; kk--; if(kk==1){ return ans; } } } return 0; } int main(){ cin>>n>>m; for(int i=1; i<=m; i++){ int aa,bb,cc; cin>>aa>>bb>>cc; e[i].u=aa; e[i].v=bb; e[i].w=cc; } Init(n); int my=kru(n); cout<<s<<" "<<k[s]<<endl; return 0; }
联络员
#include<bits/stdc++.h> using namespace std; int fa[2005]; int n,m; int a[2005][2005]; int s=0; struct edge{ int p,u,v,w; }e[305*305]; bool cmp(edge x,edge y){ return x.w<y.w; } void Init(int n){ for(int i=1; i<=n; i++){ fa[i]=i; } } int Merge(int a,int b){ int p=fa[a]; int q=fa[b]; if(p==q){ return 0; } for(int i=1; i<=n; i++){ if(fa[i]==q){ fa[i]=p; } } return 1; } int kru(int kk){ int ans=0; sort(e+1,e+m+1,cmp); for(int i=1; i<=m; i++){ if(e[i].p==1){ Merge(e[i].u,e[i].v); ans+=e[i].w; } } for(int i=1; i<=m; i++){ if(Merge(e[i].u,e[i].v)&&e[i].p==2){ ans+=e[i].w; } } return ans; } int main(){ cin>>n>>m; for(int i=1; i<=m; i++){ int pp,uu,vv,ww; cin>>pp>>uu>>vv>>ww; e[i].p=pp; e[i].u=uu; e[i].v=vv; e[i].w=ww; } Init(n); cout<<kru(n)<<endl; return 0; }

浙公网安备 33010602011771号