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;
}

 

posted @ 2023-08-05 09:44  竹余居居居居居  阅读(19)  评论(0)    收藏  举报