最小生成树

Prim:类似于Dijsktra算法
不过两者同源(看模板就会发现这俩长得都像套了BFS模板,事实上这两个算法都借鉴了BFS的思想)
code(先咕了)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int p=222;
int m[p][p],dis[p];
int n;
int ans;
void in(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&m[i][j]);
        }
    }
}
void prim(int x){
    ans=0;
    for(int i=1;i<=n;i++){
        dis[i]=m[x][i];
    }
    dis[x]=0;
    for(int i=2;i<=n;i++){
        int min=0x7f7f7f7f,k;
        for(int j=1;j<=n;j++){
            if(dis[j]<min&&dis[j]!=0){
                min=dis[j];
                k=j;
            }
        }
        ans+=dis[k];
        dis[k]=0;
        for(int j=1;j<=n;j++){
            if(dis[j]>m[k][j]){
                dis[j]=m[k][j];
            }
        }
    }
}
void out(){
    printf("%d",ans);
}
int main(){
    in();
    prim(2);
    out();
    return 0;
}

Kruscal:并查集
又是那个星星玩意折磨我
code(咕)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int p=100001;
struct edge{
    int s;
    int t;
    int v;
}e[p];
int f[p],n,m;
int ans,t;
int find(int x){
    if(f[x]!=x){
        f[x]=find(f[x]);
    }
    return f[x];
}
bool cmp(const edge &a,const edge &b){
    return a.v<b.v;
}
void in(){
    for(int i=1;i<=m;i++){
        scanf("%d%d%d",&e[i].s,&e[i].t,&e[i].v);
    }
    sort(e+1,e+m+1,cmp);
}
void renew(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        f[i]=i;
    }
}
void work(){
    for(int i=1;i<=m;i++){
        int x=e[i].s,y=e[i].t;
        int fx=find(x),fy=find(y);
        if(fx!=fy){
            f[fx]=fy;
            ans=e[i].v;
            t++;
        }
        if(t==n-1){
            break;
        }
    }
}
void out(){
    printf("%d %d\n",t,ans);
}
int main(){
    renew();
    in();
    work();
    out();
    return 0;
}
posted @   2K22  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示