文章

5

粉丝

7

获赞

9

访问

577

头像
继续畅通工程 题解:
P1311 浙江大学机试题
发布于2025年3月18日 16:27
阅读数 161

#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 105;

struct node
{
    int u; // 边的起点
    int v; // 边的终点
    int w; // 边的权值
    int flag; // 1 为已修建,0 为未修建
} edge[maxn * maxn];

int fa[maxn]; // 并查集数组,存储每个节点的父节点

int find(int x)
{
    if (fa[x] == x)
    {
        return x; // 如果当前节点是根节点,直接返回
    }
    fa[x] = find(fa[x]); // 路径压缩,将当前节点的父节点设置为根节点
    return fa[x]; // 返回根节点
}

int cmp(node a, node b)
{
    if (a.flag == b.flag)
    {
        return a.w < b.w; // 如果修建状态相同,按权值从小到大排序
    }
    return a.flag > b.flag; // 优先选择已修建的道路
}

int main()
{
    int N; // 村庄数目(节点数)
    while (cin >> N)
    {
        if (N == 0) break;

        int M = N * (N - 1) / 2; // 完全图的边数
        for (int i = 0; i < M; i++)
        {
            cin >> edge[i].u >> edge[i].v >> edge[i].w >> edge[i].flag;
        }

        // 按修建状态和权值排序
        sort(edge, edge + M, cmp);

   ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发