1 条题解

  • 0
    @ 2025-4-13 11:01:36

    Prim

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 100'000;
    const int MAXM = 1'000'000;
    const int INF = 1'000'000'000 + 1;
    int n, m;
    int h[MAXN + 5];
    vector<pair<int, int>> e[MAXN + 5];
    //<<点的高度,到树距离>,点的编号>
    priority_queue<pair<pair<int, int>, int>> q;
    int dis[MAXN + 5];
    bool vis[MAXN + 5];
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> h[i];
        for (int i = 1; i <= m; i++)
        {
            int u, v, w;
            cin >> u >> v >> w;
            e[u].push_back({v, w});
            e[v].push_back({u, w});
        }
        for (int i = 1; i <= n; i++)
        {
            dis[i] = INF;
            vis[i] = false;
        }
        dis[1] = 0;
        q.push({{h[1], -dis[1]}, 1}); // 高度高优先、距离短优先
        while (!q.empty())
        {
            int u = q.top().second;
            q.pop();
            if (vis[u])
                continue;
            vis[u] = true;
            for (int i = 0; i < e[u].size(); i++)
            {
                int v = e[u][i].first;
                int w = e[u][i].second;
                if (vis[v] || h[v] > h[u])
                    continue;
                if (w < dis[v])
                {
                    dis[v] = w;
                    q.push({{h[v], -dis[v]}, v});
                }
            }
        }
        int ans = 0;
        int cnt = 0;
        for (int i = 1; i <= n; i++)
            if (dis[i] != INF)
            {
                cnt++;
                ans += dis[i];
            }
        cout << cnt << " " << ans;
        return 0;
    }
    

    信息

    ID
    3389
    时间
    5000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    36
    已通过
    12
    上传者