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

国王已决定保持尽可能少的道路免费,但是两个不同的村庄之间都应该一条且仅由一条 且仅由一条免费道路的路径连接。同时,虽然水泥路更适合现代交通的需 要,但国王也认为走在鹅卵石路上是一件有趣的事情。所以,国王决定保持刚好 K 条鹅卵石路免费。

举例来说,假定新亚王国的村庄和道路如图 3(a)所示。如果国王希望保持两 条鹅卵石路免费,那么可以如图 3(b)中那样保持道路(1, 2)、(2, 3)、(3, 4)和(3, 5) 免费。该方案满足了国王的要求,因为:(1)两个村庄之间都有一条由免费道 路组成的路径;(2)免费的道路已尽可能少;(3)方案中刚好有两条鹅卵石道路 (2, 3)和(3, 4)

Solution

题意:有黑白两种边,求一科最小生成树使他恰好有k条百边

直接先选k条白边再加黑边是错的,因为加完之后图可能不连通,所以我们先要弄清楚哪些白边是必须加的。

我们先对所有黑边做生成树,在对白色边跑一遍,这样我们就求出了哪些白边是必须要加的。

然后我们再跑一遍生成树,先把必须加的加上,再把K条白边补齐,最后再跑黑边。

接下来就是恶心的判不合法环节,

如果图不连通,GG。

如果必须加的边大与k,GG。

如果加的边到不了k,GG。

Code

#include<iostream>
#include<cstdio>
#define N 20002
#define M 100002
using namespace std;
int f[N],n,m,num,k,kk,tot,tot1,kkk;
bool t[M];
struct node{
int u,v;
}e[M],g[M];
int find(int x){return f[x]=f[x]==x?x:find(f[x]);}
int main(){
scanf("%d%d%d",&n,&m,&k);kkk=kk=k;int u,v,tag;
for(int i=;i<=m;++i){
scanf("%d%d%d",&u,&v,&tag);
if(tag)e[++tot].u=u,e[tot].v=v;
else g[++tot1].u=u,g[tot1].v=v;
}
for(int i=;i<=n;++i)f[i]=i;
for(int i=;i<=tot;++i){
u=find(e[i].u),v=find(e[i].v);
if(u!=v){
f[u]=v;
num++;
}
}
for(int i=;i<=tot1;++i){
u=find(g[i].u);v=find(g[i].v);
if(u!=v){
f[u]=v;
t[i]=;
num++;k--;
}
}
if(num!=n-||k<){
printf("no solution\n");
return ;
}
num=;
for(int i=;i<=n;++i)f[i]=i;
for(int i=;i<=tot1;++i)if(t[i]){
u=find(g[i].u);v=find(g[i].v);
f[u]=v;kk--;num++;
}
for(int i=;i<=tot1;++i)if(!t[i]){
if(!kk)break;
u=find(g[i].u);v=find(g[i].v);
if(u!=v){f[u]=v;kk--;num++;}
}
for(int i=;i<=tot;++i){
u=find(e[i].u),v=find(e[i].v);
if(u!=v){f[u]=v;num++;}
}
if(num!=n-||kk){
printf("no solution\n");
return ;
}
for(int i=;i<=n;++i)f[i]=i;
for(int i=;i<=tot1;++i)if(t[i]){
u=find(g[i].u);v=find(g[i].v);
f[u]=v;kkk--;printf("%d %d 0\n",g[i].u,g[i].v);
}
for(int i=;i<=tot1;++i)if(!t[i]){
if(!kkk)break;
u=find(g[i].u);v=find(g[i].v);
if(u!=v){
f[u]=v;
kkk--;printf("%d %d 0\n",g[i].u,g[i].v);
}
}
for(int i=;i<=tot;++i){
u=find(e[i].u),v=find(e[i].v);
if(u!=v){
f[u]=v;
printf("%d %d 1\n",e[i].u,e[i].v);
}
}
return ;
}

[APIO2008]免费道路(生成树)的更多相关文章

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

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

  2. BZOJ 3624: [Apio2008]免费道路 [生成树 并查集]

    题意: 一张图0,1两种边,构造一个恰有k条0边的生成树 优先选择1边构造生成树,看看0边是否小于k 然后保留这些0边,补齐k条,再加1边一定能构成生成树 类似kruskal的证明 #include ...

  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. [BZOJ3624][Apio2008]免费道路

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

  9. [APIO2008]免费道路

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

随机推荐

  1. nginx之快速查找配置文件

    nginx的配置放在nginx.conf文件中,一般我们可以使用以下命令查看服务器中存在的nginx.conf文件.   locate nginx.conf /usr/local/nginx/conf ...

  2. MySQL 的两个特殊属性 unsigned与 zerofill

    1 unsigned unsigned 就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32.看起来unsigned ...

  3. C# Note25: .Net Core

    .NET Core全面扫盲贴 .NET Core与.NET Framework.Mono之间的关系 https://www.postgresql.org/

  4. Spring 基于XML配置

    基于XML的配置 对于基于XML的配置,Spring 1.0的配置文件采用DTD格式,Spring2.0以后采用Schema格式,后者让不同类型的配罝拥有了自己的命名空间,使得配置文件更具扩展性.此外 ...

  5. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  6. ssh 登陆服务器原理

    这里分两种情况,这两种情况都涉及到公钥加密的概念. 由于公钥加密概念作为基础就不在本文进行讨论了. 使用ssh对远程服务器进行密码登录发生了什么: 客户端通过ssh连接服务器 1. 首先服务器把自己的 ...

  7. 5款Python程序员高频使用开发工具推荐

    很多Python学习者想必都会有如下感悟:最开始学习Python的时候,因为没有去探索好用的工具,吃了很多苦头.后来工作中深刻体会到,合理使用开发的工具的便利和高效.今天,我就把Python程序员使用 ...

  8. python数学第九天【统计】

  9. css的特性

    一.继承性: 继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代. /* 不具有继承性的css样式: */p{border:1px solid red;} 二.特殊性(优先 ...

  10. jedis集群版应用

    1.pom文件添加依赖: 2.创建配置文件 <!-- jedis集群版配置(JedisCluster通过构造传参(2个参数)) --> <bean id="redisCli ...