当前位置: 首页 > news >正文

P3623 免费道路 - Kruskal

P3623 免费道路 - Kruskal

P3623 免费道路

题意

给定无向图及其权值 \(0/1\),求权值和为 \(n-k-1\) 的生成树。

思路

令鹅卵石为 \(1\),则为求权值和为 \(k\) 的生成树。分类讨论后易得有些权值为一的边不能不放,他们关乎图的联通性。所以我们先求出这些边,即先作一遍边权为 \(0\) 的生成树,然后求出必须的权为 \(1\) 的边。

然后的权为 \(1\) 的边就可一随意摆放,即在必须的 \(1\) 填上后,再将边权和填到 \(k\),最后用 \(0\) 边保证图联通。

无解的情况:

  1. 边权和小于 \(k\)
  2. 边权和等于 \(k\),但图不连通。
  3. 边权和大于 \(k\),但图连通。

Code

#include <bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn = 2e4+10;
constexpr int maxm = 1e5+10;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;typedef struct edge
{int x,y,w;
}edge;int n,m,k;
edge edges1[maxm];// erluan shi
edge edges0[maxm];// shuini
int id0,id1,idx;
edge need[maxn];int fa[maxn];void init()
{for(int i=1;i<=n;++i){fa[i]=i;}
}int finr(int x)
{return fa[x]==x ? x : fa[x]=finr(fa[x]);
}bool kruskal1()// 找出必须的鹅卵石路
{init();int cnt=0;for(int i=1;i<=id0;++i){int xr=finr(edges0[i].x);int yr=finr(edges0[i].y);if(xr!=yr){++cnt;fa[xr]=yr;}if(cnt>=n-1){break;}}for(int i=1;i<=id1;++i){int xr=finr(edges1[i].x);int yr=finr(edges1[i].y);if(xr!=yr){++cnt;fa[xr]=yr;need[++idx]=edges1[i];edges1[i].w=-1;}if(cnt>=n-1){break;}}if(cnt<n-1 || idx>k){return 0;}return 1;
}bool kruskal2()
{init();int cnt1=0;int cnt=0;for(int i=1;i<=idx;++i){int xr=finr(need[i].x);int yr=finr(need[i].y);if(xr!=yr){++cnt1;++cnt;fa[xr]=yr;}}for(int i=1;i<=id1 && cnt1<k;++i){if(edges1[i].w==-1){continue;}int xr=finr(edges1[i].x);int yr=finr(edges1[i].y);if(xr!=yr){++cnt1;++cnt;fa[xr]=yr;need[++idx]=edges1[i];}}for(int i=1;i<=id0;++i){int xr=finr(edges0[i].x);int yr=finr(edges0[i].y);if(xr!=yr){++cnt;fa[xr]=yr;need[++idx]=edges0[i];}if(cnt>=n-1){break;}}if(cnt!=n-1 || cnt1!=k){return 0;}return 1;
}signed main()
{#ifndef ONLINE_JUDGEfreopen("cjdl.in","r",stdin);freopen("cjdl.out","w",stdout);#endif // ONLINE_JUDGEscanf("%lld%lld%lld",&n,&m,&k);for(int i=1,x,y,w ;i<=m;++i){scanf("%lld%lld%lld",&x,&y,&w);if(w){edges0[++id0]={x,y,0};}else{edges1[++id1]={x,y,1};}}if(!kruskal1()){printf("no solution\n");return 0;}if(!kruskal2()){printf("no solution\n");return 0;}else{for(int i=1;i<=idx;++i){printf("%lld %lld %lld\n",need[i].x,need[i].y,need[i].w^1);}}return 0;
}
http://www.gsyq.cn/news/45541.html

相关文章:

  • 幂塔问题-扩展欧拉函数
  • 手持贴标机生产源头厂家2025年市场洞察
  • 奶牛抗议-二维偏序优化
  • 4G摄像机国标GB28181接入EasyGBS突然不上线?双网卡智能切换惹的锅!
  • 详细介绍:热门编程语言的排名及开源贡献比例表格-截至2025年10月
  • SQLite 连接串说明
  • 完整教程:深度学习实战:从图像分类到自然语言处理的完整指南
  • 【完整源码+内容集+部署教程】 黄瓜叶片检测系统源码和数据集:改进yolo11-RVB
  • 国产化Word处理控件Spire.Doc教程:使用Java将RTF文件转换为PDF的全面教程
  • 2025年门卫室岗亭源头厂家综合实力榜单:形象岗亭/小区值班岗亭/钢结构吸烟亭源头厂家精选
  • 树莓派性能分析脚本
  • 2025 ICPC 南京站 游记
  • windows客户端配置免密上传代码到gitlab
  • 神级项目,Github 上线封神,BettaFish你不可忽视的多Agent舆情分析神器~~~
  • MyEMS:赋能能源精细化管理的智慧引擎
  • 2025年新型建筑木方源头厂家综合实力榜单:建筑施工模板/覆膜建筑模板/清水覆膜板生产厂家精选
  • 开源能源管理系统:解锁当下能源困局的关键力量
  • 详细介绍:五点法求解相机的相对位姿
  • Gitee:打造本土化技术生态,驱动中国数字化变革新引擎
  • 2025年卫生应急服生产厂家综合实力榜单:卫生应急藏青无领T恤/黑色立领外套/纯棉黑T恤源头厂家精选
  • 2025年11月学习机品牌推荐:家长口碑榜对比十强同步教材与护眼方案
  • Linux crond - Lafite
  • 鸿蒙应用开发实战:应用数据备份恢复
  • 实用指南:[数据结构] 队列实战!火车车厢重排从 0 到 1:缓冲轨巧用 + 可运行代码
  • Kerberos常见工具错误解析与修复指南
  • vim 配置
  • HT-LFCG-3400+,0改版,测试数据贴图
  • C# 基础——async/await 的实现原理与最佳实践
  • 7885
  • 77777