\(kruskal\)好题

\(0\)边的数量在某些情况下是可以无限制的调控的,前提是所有必须存在的边都在生成树里了

所以应该分别求出有哪些边是必须在生成树里的,我们可以先从大到小排序,求出有哪些\(0\)边必须在生成树里,之后再从小到大排序,求出那些\(1\)边必须在生成树里

之后剩下的边就可以随便放了,调控\(0\)边的个数恰好为\(k\)即可

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define LL long long
#define re register
#define maxn 20005
struct E
{
int u,v,w;
}e[100005],Ans[100005];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int fa[maxn],sz[maxn];
int n,m,tot,k,num;
inline void Rebuild() { for(re int i=1;i<=n;i++) fa[i]=i,sz[i]=1; }
int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
inline int merge(int x,int y)
{
int xx=find(x),yy=find(y);
if(xx==yy) return 0;
if(sz[xx]>sz[yy]) fa[yy]=xx,sz[xx]+=sz[yy];
else fa[xx]=yy,sz[yy]+=sz[xx];
return 1;
}
inline int cmp1(E A,E B)
{
return A.w<B.w;
}
inline int cmp2(E A,E B)
{
return A.w>B.w;
}
int main()
{
n=read(),m=read(),k=read();
for(re int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read();
Rebuild();
std::sort(e+1,e+m+1,cmp2);
for(re int i=1;i<=m;i++)
if(merge(e[i].u,e[i].v)&&!e[i].w)
Ans[++tot].u=e[i].u,Ans[tot].v=e[i].v,Ans[tot].w=0,num++;
if(tot>k)
{
puts("no solution");
return 0;
}
std::sort(e+1,e+m+1,cmp1);
Rebuild();
for(re int i=1;i<=m;i++)
if(merge(e[i].u,e[i].v)&&e[i].w)
Ans[++tot].u=e[i].u,Ans[tot].v=e[i].v,Ans[tot].w=1;
Rebuild();
for(re int i=1;i<=tot;i++)
merge(Ans[i].u,Ans[i].v);
for(re int i=1;i<=m;i++)
{
if(!e[i].w&&num>=k) continue;
if(merge(e[i].u,e[i].v))
{
if(!e[i].w&&num<k) num++;
Ans[++tot].u=e[i].u,Ans[tot].v=e[i].v,Ans[tot].w=e[i].w;
}
}
if(tot!=n-1||num<k) puts("no solution");
else for(re int i=1;i<=tot;i++) printf("%d %d %d\n",Ans[i].u,Ans[i].v,Ans[i].w);
return 0;
}

【[APIO2008]免费道路】的更多相关文章

  1. [BZOJ3624][Apio2008]免费道路

    [BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...

  2. bzoj 3624: [Apio2008]免费道路 生成树的构造

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 111  Solved: 4 ...

  3. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  4. BZOJ 3624: [Apio2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1201  Solved:  ...

  5. [Apio2008]免费道路[Kruscal]

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1292  Solved:  ...

  6. P3623 [APIO2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...

  7. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  8. [APIO2008]免费道路

    [APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...

  9. [APIO2008]免费道路(生成树)

    新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可能保持所有道路免费.为此亟待制定一个新的 ...

  10. 【bzoj3624】Apio2008—免费道路

    http://www.lydsy.com/JudgeOnline/problem.php?id=3624 (题目链接) 题意 给出一张无向图,其中有0类边和1类边.问能否构成正好有K条0类边的生成树, ...

随机推荐

  1. 阿里巴巴Java开发规约插件使用

    10月14日上午9:00 阿里巴巴于在杭州云栖大会<研发效能峰会>上,正式发布<阿里巴巴Java开发手册>扫描插件,该插件在扫描代码后,将不符合<手册>的代码按Bl ...

  2. 禁止选中页面内容-兼容ie、firefox、chrome

    使用js禁止用户选中网页上的内容,IE及Chrome下的方法一样.使用onselectstart, 比如: 在body中加入<body onselectstart="return fa ...

  3. mongodb在w10安装及配置

    官网网站下载mongodb 第一步:安装 默认安装一直next,直到choose setup type,系统盘空间足够大,安装在c盘就好 第二步:配置及使用 1.创建目录mongodb,及三个文件夹d ...

  4. [JAVA IDEA]在使用maven项目中,无法读取resources文件夹中的配置文件的一种解决方案

    1.在通过配置文件来连接数据库时,在resouces文件中放入了db.properties配置文件,但无法正常读取到 读取配置文件信息的代码: InputStream input=JdbcUtil.c ...

  5. 工厂模式的认识(GOF23)

    ---恢复内容开始--- 对于所有的设计模式来说,其本质是哪里变化封装哪里.寻找变化点,没有万能的模式,只有适合情况的应用 工厂模式从简单工厂开始演化 1.简单工厂的主要作用在于从源头开始封装实例化, ...

  6. 常用SEO优化

  7. mysql中LOCATE和CASE WHEN...THEN...ELSE...END结合用法

    之前项目中需要写一个sql,就是查出某个调研详情中,选A答案,B答案,C答案...F答案的人各有多少人,这个sql也是费了很大的力气才写出来,故记下来,方便以后使用. 其中tbl_research_i ...

  8. Node服务端极速搭建 -- nvmhome

    > 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...

  9. Ubuntu,忘记了root密码,怎么重置?

    进入单用户模式: 1.开机到grub时,用上下键移到第二行的恢复模式,按e(注意不是回车) 即Ubuntu,With Linux 3.2.0-23-generic(recovery mode) 2.把 ...

  10. IOS地理信息使用

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个 ...