\(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. C# 批量 json 读取

    // 方法一 //string test = "[{ 'CreateUser': 'CN=koujirou nishikawaOMHBK','CreateUserJ': '西川 公二郎'}, ...

  2. springboot+mybatis遇到BUG:自动注入失败

    今天用springboot+mybatis写一个小demo遇到如下错误 Error starting ApplicationContext. To display the conditions rep ...

  3. java 通用对象排序

    一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...

  4. javaweb项目中绝对路径的写法理解

    Tomcat的默认访问路径为http://localhost:8080,后需添加项目路径. 请求转发,是转发到本项目中的其他文件,所以在默认访问路径中添加了本项目的项目路径,故可以省略项目名称: re ...

  5. 03:成绩排序 个人博客:doubleq.win

    个人博客:doubleq.win 03:成绩排序 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出 ...

  6. 理解position:relative

    前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...

  7. HTML5 Canvas中绘制椭圆的几种方法

    1.canvas自带的绘制椭圆的方法 ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise)是后来 ...

  8. js中的正则表达式的运用

    正则表达式是一个拆分字符串并查询相关信息的过程:是现代开发中很重要的一环.作为一个web开发人员必须牢牢掌握这项技能,才能尽情得在js中驰骋. 1.创建正则表达式: 正则表达式(regular exp ...

  9. CentOS6.5(4)----宿主机无法访问虚拟机中的web服务解决方案

    宿主机无法访问虚拟机中的web服务 在Windows7宿主机中的VMware虚拟机中安装了CentOS6.5操作系统,并且基于Nginx搭建了Web服务器,网页刚刚搭建好的时候,通过宿主机的浏览器可以 ...

  10. C++11 之for 新解 auto

    C++11 之for 新解 auto  前言    C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是 ...