最小生成树

Kruskal

前置:并查集

struct node
{
    ll u, v, w;
} t[200005];

ll fa[200005], n, m, ans, eu, ev, cnt;

inline bool cmp(node a, node b)
{
    return a.w < b.w;
}

inline ll find(ll x)
{
    if (fa[x] == x)
        return x;
    return fa[x] = find(fa[x]);
}

inline void K()
{
    sort(t, t + m, cmp);
    for (int i = 1; i <= m; ++i)
    {
        eu = find(t[i].u), ev = find(t[i].v);
        if (eu == ev)
            continue;
        ans += t[i].w;
        fa[ev] = eu;
        if (++cnt == n)
            break;
    }
}

int main()
{
    n = read();
    m = read();
    for (int i = 1; i <= n; ++i)
        fa[i] = i;
    for (int i = 1; i <= m; ++i)
        t[i].u = read(), t[i].v = read(), t[i].w = read();
    K();
    printf("%lld
", ans);
    Edison Ba;
}

Prim

int ans, cnt, now = 1; //Prim
void prim()
{
    for (int i = 2; i <= n; ++i)
        dis[i] = MAXN;

    for (int i = head[1]; i; i = t[i].nxt)
        dis[t[i].to] = min(dis[t[i].to], t[i].w);

    while (++cnt < n)
    {
        int minn = MAXN;
        vis[now] = 1;
        for (int i = 1; i <= n; ++i)
        {
            if (vis[i])
                continue;
            if (minn > dis[i])
            {
                minn = dis[i];
                now = i;
            }
        }

        ans += minn;

        for (int i = head[now]; i; i = t[i].nxt)
        {
            int y = t[i].to, z = t[i].w;
            if (vis[y])
                continue;
            if (dis[y] > z)
            {
                dis[y] = z;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/EdisonBa/p/14948872.html