文章
5
粉丝
7
获赞
9
访问
580
#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);
...
登录后发布评论
暂无评论,来抢沙发