当前位置: 首页 > 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.jsqmd.com/news/36628/

相关文章:

  • 2025年11月安徽合肥正规的除甲醛平台推荐排行榜单
  • 2025年11月安徽合肥除甲醛服务商推荐排行榜前十名
  • 手持贴标机生产源头厂家2025年市场洞察
  • 2025年市场上水果打标枪生产厂家排名前十:陕西彩航包装领跑行业
  • 2025年水果打标枪生产厂家Top10排名:彩航包装装潢有限公司领跑行业
  • 关于在CASS软件中导入SHP文件时出现文字乱码问题的解决方案
  • 关押罪犯P1525:并查集
  • 奶牛抗议-二维偏序优化
  • 4G摄像机国标GB28181接入EasyGBS突然不上线?双网卡智能切换惹的锅!
  • CF2117G 并查集
  • gitlab项目下载地址ip显示字符串问题
  • python中MySQL(pymsql)的使用基础
  • 水箱液位pid控制仿真,综合一阶滞后对象+阀门流量特性+不同厂家pid算法
  • DeepSeek大模型应用与实践 掌握的知识内容
  • 2025年山东视保姆公司综合实力榜单:视保姆眼镜公司/视保姆3V疗法/视保姆镜架源头企业精选
  • AI大模型高级应用 掌握的知识内容
  • 会议中心-贪心/dp
  • 安卓app自动化操作方案实现
  • 详细介绍:热门编程语言的排名及开源贡献比例表格-截至2025年10月
  • 二进制题
  • 人工智能工程技术,掌握的知识内容
  • SQLite 连接串说明
  • SRS(simple-rtmp-server) 一快速环境搭建
  • SQL中GROUP BY WITH ROLLUP和GROUPING 函数的使用
  • ⚡️ 高性能绿色Markdown文档阅读器:Litho Book技能架构深度解析
  • 完整教程:深度学习实战:从图像分类到自然语言处理的完整指南
  • 【完整源码+内容集+部署教程】 黄瓜叶片检测系统源码和数据集:改进yolo11-RVB
  • EasyGBS/EasyNVR高并发适配!PostgreSQL部署指南
  • 详细介绍:K8S(七)—— Kubernetes Pod 进阶配置与生命周期管理全解析
  • 2025年门卫室岗亭源头厂家综合实力榜单:形象岗亭/小区值班岗亭/钢结构吸烟亭源头厂家精选