以下是使用prim算法求解最小生成树,并判断每个节点的子节点个数的C++代码示例:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

const int MAXN = 1005;
const int INF = 0x3f3f3f3f;

struct Edge {
    int from, to, weight;
};

vector<Edge> edges[MAXN];
int dis[MAXN];
bool vis[MAXN];

void prim(int start) {
    memset(dis, INF, sizeof(dis));
    memset(vis, false, sizeof(vis));
    dis[start] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push(make_pair(0, start));

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();

        if (vis[u]) continue;
        vis[u] = true;

        for (int i = 0; i < edges[u].size(); i++) {
            int v = edges[u][i].to;
            int w = edges[u][i].weight;

            if (!vis[v] && w < dis[v]) {
                dis[v] = w;
                pq.push(make_pair(dis[v], v));
            }
        }
    }
}

int main() {
    int n, m;
    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        edges[u].push_back({ u, v, w });
        edges[v].push_back({ v, u, w });
    }

    prim(1);

    int cnt[MAXN];
    memset(cnt, 0, sizeof(cnt));

    for (int u = 1; u <= n; u++) {
        for (int i = 0; i < edges[u].size(); i++) {
            int v = edges[u][i].to;
            int w = edges[u][i].weight;

            if (dis[v] == w && dis[v] != INF) {
                cnt[u]++;
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        cout << cnt[i] << " ";
    }

    return 0;
}

在这个例子中,我们使用了一个cnt数组来记录每个节点的子节点个数。通过在prim算法的过程中记录每个节点的父节点,我们可以在最后遍历每条边,找到所有子节点,然后给它们的父节点的cnt值加1。

需要注意的是,这个代码示例中的prim算法是使用堆优化的Dijkstra算法实现的。因为堆优化的Dijkstra算法和prim算法非常相似,所以我们可以很容易地将它们结合起来

prim最小生成树判断该点的子节点个数的c++代码

原文地址: https://www.cveoy.top/t/topic/fn3a 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录