最小生成树模板.


prim:

#include <cstdio>
#include <cstring>

const int INF = 0x3f3f3f3f;
const int maxn = 110;
bool vis[maxn];
int lowc[maxn];

int prim(int cost[][maxn],int n) //dian bian hao 0 ~ n - 1

{
    int ans = 0;
    memset(vis,false ,sizeof vis);
    vis[0] = true;
    for(int i = 1;i < n;++i)
        lowc[i] = cost[0][i];
    for(int i = 1;i < n;++i)
    {
        int minc = INF;
        int k = -1;
        for(int j = 0;j < n;++j)
        {
            if(!vis[j] && minc > lowc[j])
            {
                minc = lowc[j];
                k = j;
            }
        }
        if(minc == INF) return -1; //原图不连通
        ans += minc;
        vis[k] = true;
        for(int j = 0; j < n;++j)
            if(!vis[j] && lowc[j] > cost[k][j])
                 lowc[j] = cost[k][j];
    }
    return ans;
}


kruskal

#include <cstdio>
#include <algorithm>

using namespace std;

const int max_edge_cnt = 5005;
const int max_point_cnt = 110;
struct edge{
    int u,v,w;
}Edge[max_edge_cnt];
int tot = 0; //边的数量
int p[max_point_cnt];

int cmp(const edge x,const edge y)

{
    return x.w < y.w;
}

int find(int x)
{
    return p[x] == x ? x : p[x] = find(p[x]);
}

void addEdge(int a,int b,int c)

{
    Edge[tot].u = a;
    Edge[tot].v = b;
    Edge[tot++].w = c;
}

int Kruskal(int n) //n是点的数量 0 ~ n - 1

{
    for(int i = 0;i < n;++i)
        p[i] = i;
    sort(Edge,Edge + tot,cmp);
    int cnt = 0;
    int ans = 0;
    for(int i = 0;i < tot;++i)
    {
        int u = Edge[i].u;
        int v = Edge[i].v;
        int w = Edge[i].w;
        int x = find(u);
        int y = find(v);
        if(x != y)
        {
            ans += w;
            p[x] = y;
            cnt++;
        }
        if(cnt == n - 1) break;
    }
    if(cnt < n - 1) return -1; //不连通
    else return ans;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值