最小生成树prim and kruskal +链式前向心

链式前向心

int add(int next,int v,int w){
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[next];
    head[next]=cnt;
}
struct mp{
    int v;
    int next;
    int w;
    
}e[2000000];
int head[2000000],cnt=0;

prim算法

复制代码
int dis[INF],vis[INF],now=1,ans = 0,minn=INF;
int prim(){
    memset(dis,INF,sizeof(dis));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<n;i++){
                vis[now]=1;
        for(int j=head[now];j;j=e[j].next){
            if(dis[e[j].v]>e[j].w&&!vis[e[j].v])
                dis[e[j].v]=e[j].w;
        }
        for(int j=1;j<=n;j++){
            if(!vis[j]&&minn > dis[j])
            {
                minn = dis[j];
                now = j;
            }
        }
        ans += minn;
    }
    return ans;
}                
复制代码

 kruskal算法boruvka算法 

复制代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0x3f3f3f
int n,m,f[INF],ans = 0, num = 0;
struct mp{
    int v;
    int next;
    int w;
    
}e[INF];
bool cmp(mp a,mp b){
    return a.w < b.w;
}
int find(int k){
    if(f[k] == k) return k;
    else return find(f[k]);
}
void kruskal()
{
    sort(e+1, e + 1 + m,cmp);
    for(int i = 1; i <= m; i++)
    {
        int t1 = find(e[i].next);
        int t2 = find(e[i].v);
        if(t1 == t2) continue;
        ans += e[i].w;
        f[t1] = t2;
        if(++num == n - 1) break;
    }
}
int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++) f[i]=i;
    for(int i = 1; i <= m; i++){
        cin >> e[i].next >> e[i].v >> e[i].w;
    }
    kruskal();
    cout << ans;
    return 0;
}
复制代码

 推荐去看

posted @   leojiang  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示