prim & kruskal

prim

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 510, inf = 0x3f3f3f3f;
int g[N][N], dis[N];
int n, m;
bool vis[N];

void prim()
{
    memset(dis, 0x3f, sizeof dis);
    dis[1] = 0;
    for (int i = 1; i < n; i++)
    {
        int x = 0;
        for (int j = 1; j <= n; j++)
            if (!vis[j] && (x == 0 || dis[j] < dis[x]))
                x = j;

        vis[x] = true;
        for (int y = 1; y <= n; y++)
        {
            if (!vis[y])
                dis[y] = min(dis[y], g[x][y]);
        }
    }
}
int main()
{
    cin >> n >> m;
    memset(g, 0x3f, sizeof g);
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        g[x][y] = g[y][x] = min(g[x][y], z);
    }
    prim();

    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans += dis[i];
    if (ans > inf / 2) //存在不連通的點
        cout << "impossible" << endl;
    else
        cout << ans << endl;
    return 0;
}

kruskal

#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
struct node
{
    int x, y, z;
    bool operator<(const node &a) const
    {
        return z < a.z;
    }
} e[N * 2];
int p[N], n, m;

void init(int n)
{
    for (int i = 0; i <= n; i++)
        p[i] = i;
}

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

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> n >> m;
    init(n);
    for (int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        e[i] = {x, y, z};
    }

    sort(e, e + m);
    int ans = 0;
    for (int i = 0; i < m; i++)
    {
        int x = e[i].x;
        int y = e[i].y;
        int z = e[i].z;
        x = find(x);
        y = find(y);
        if (x != y)
        {
            ans += z;
            p[x] = y;
        }
    }
    int fa = find(1);
    bool flag = true; //判斷是否全部在一棵樹上 
    for (int i = 2; i <= n; i++)
    {
        if (fa != find(i))
            flag = false;
    }
    if (flag)
        cout << ans << endl;
    else
        cout << "impossible" << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章