3624: [Apio2008]免费道路
Description

Input

Output

Sample Input
5 7 2
1 3 0
4 5 1
3 2 0
5 3 1
4 3 0
1 2 1
4 2 1
Sample Output
3 2 0
4 3 0
5 3 1
1 2 1
/* 比较优秀的一道题
我们对于这个K上来第一反应可能就是先找k个0,别的再说
但这个显然错误。(没准只有我个蒟蒻真试了=-=)
但是我们反过来想,如果c值为1的边和小于k条的c值为0的
边,能够使得这个图成立(即树)。那么我们将其中的一些c值
为1的边替换成c值为0的边,这个图还能成立。
证明我们可以这么想,首先我们已经搞出了一棵树,当我们
砍掉一条树枝时,就分成了两个树(这里一个点也看作一棵树),
即树a,树b,我们刚才砍了一条边,就要补一条边,补上的这
条边显然不可以是a中一点连a中另一点,b同理(万恶的并查集)
,那么只能是a中的某一点连到b中的某一点,那么此时它又变成
了一棵树。
同时还有一件事就是,对于c值为1的边,无论链接顺序怎样
最后连接的边数都是定值。(这里指用c值为1的边贪心的生成树)。
然后一切就都好办了,先贪心跑一遍c值为1的边,再在此基
础上跑c值为0的边(即最少需要c值为0的边的边数)。若此时不
能构成一颗完全的树,或者最少需要的c值为0的边的边数都大于
K显然无解。反之,我们把刚才用到的c值为0的边全部使用,再
补上剩下c值为0的边来满足K,如果不够k,无解。否则我们再跑
c值为1的就好了。
【注】 这个大视野卡回车啊!!!
#include<cstdio>
using namespace std;
const int N=;
struct edges{int u,v,c;}edge[N];
int n,m,k;
int stack[N],top;
int beg[],ed[];
int fa[N];
bool chos[N];
int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]);}
int sum[];
void solve(int op,int up){
for(int i=;i<=m&&sum[op]<up;i++){
if(edge[i].c==op){
int u=edge[i].u,v=edge[i].v;
u=find(u),v=find(v);
if(u!=v){
sum[op]++;fa[v]=u;stack[++top]=i;chos[i]=true;
}
}
}
} void special(){
for(int i=;i<=m;i++){
if(edge[i].c==&&chos[i]){
int u=edge[i].u,v=edge[i].v;
u=find(u),v=find(v);
if(u!=v){
fa[v]=u;
stack[++top]=i;
sum[]++;
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++){
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].c);
}
for(int i=;i<=n;i++) fa[i]=i;
solve(,N);
solve(,N);
if(sum[]+sum[]<n-||sum[]>k){
printf("no solution\n");
return ;
}
top=;
for(int i=;i<=n;i++){fa[i]=i;}
sum[]=sum[]=;
special();
solve(,k);
if(sum[]<k) {
printf("no solution\n");return ;
}
solve(,n--k);
for(int i=,j;i<=top;i++){
j=stack[i];
printf("%d %d %d\n",edge[j].u,edge[j].v,edge[j].c);
}
}
3624: [Apio2008]免费道路的更多相关文章
- bzoj 3624: [Apio2008]免费道路 生成树的构造
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 111 Solved: 4 ...
- BZOJ 3624: [Apio2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1201 Solved: ...
- BZOJ 3624 [Apio2008]免费道路:并查集 + 生成树 + 贪心【恰有k条特殊路径】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3624 题意: 给你一个无向图,n个点,m条边. 有两种边,种类分别用0和1表示. 让你求一 ...
- BZOJ 3624: [Apio2008]免费道路 [生成树 并查集]
题意: 一张图0,1两种边,构造一个恰有k条0边的生成树 优先选择1边构造生成树,看看0边是否小于k 然后保留这些0边,补齐k条,再加1边一定能构成生成树 类似kruskal的证明 #include ...
- BZOJ.3624.[APIO2008]免费道路(Kruskal)
题目链接 我们发现有些白边是必须加的,有些是多余的. 那么我们先把所有黑边加进去,然后把必须要加的白边找出来. 然后Kruskal,把必须要加的白边先加进去,小于K的话再加能加的白边.然后加黑边. 要 ...
- bzoj 3624: [Apio2008]免费道路【生成树+贪心】
先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可. 注意判断无解 #incl ...
- Bzoj 3624: [Apio2008]免费道路 (贪心+生成树)
Sample Input 5 7 2 1 3 0 4 5 1 3 2 0 5 3 1 4 3 0 1 2 1 4 2 1 Sample Output 3 2 0 4 3 0 5 3 1 1 2 1 这 ...
- [Apio2008]免费道路[Kruscal]
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1292 Solved: ...
- P3623 [APIO2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...
随机推荐
- Thinkphp中的内置标签用法
Thinkphp中的内置标签有:Volist,Foreach,For,Switch,比较标签,范围判断标签,IF,Present,Empty,Defined,Assign,Define,标签嵌套,im ...
- Qt开发陷阱一QSTACKWIDGET
原始日期:2015-10-14 00:55 1.使用QStackWidget控件的setCurrentIndex方法时,要注意参数0对应着ui上StackWidget的page1,而不是page0,没 ...
- 批量自动更新SVN版本库 - Windows
开发过程中每天都要从SVN代码库里一个一个的update各个项目代码,不仅效率实在是低,也不符合程序员的"懒"精神,由于是在Windows环境做开发,自然就想到了使用bat来实现自 ...
- Javaee需不需要培训?培训完可以顺利找到工作吗?
Javaee需不需要培训?培训完可以顺利找到工作吗? 在IT行业中Java以它通用性.高效性.平台移植性和安全性遍布各个领域,它的火热也给IT市场发展带来一定影响,随着Java技术的广泛运营,企业对J ...
- ant使用
摘录于他人精华,原文出处http://www.blogjava.net/hoojo/archive/2013/06/14/400550.html 1.project 节点元素 project 元素是 ...
- 进入MVC处理通道
这一篇主要讲如何通过Asp.net处理管道把请求交给MVC进行处理的(进入MVC处理通道). 首先来看一下经典的Asp.net处理管道的生命周期. 我们知道一个ASP.NET应用程序可以有多个Http ...
- 团队开发冲刺2-----1day
第二冲刺阶段团队软件开发第二阶段冲刺 冲刺目标: 1.在第一阶段的基础上完成app内部界面设计. 2.逐步完成app内每一部分内容. 3.对app的实现进一步仔细钻研考虑. 4.对app每一部分内容模 ...
- 我眼中的ASP.NET Core之微服务
### 前言 前几天在博客园看到有园友在分享关于微软的一个微服务架构的示例程序,想必大家都已经知道了,那就是[eShopOnContainers](https://github.com/dotnet- ...
- Unity 游戏框架搭建 (一) 概述
为了重构手头的一款项目,翻出来当时未接触Unity时候收藏的视频<Unity项目架构设计与开发管理>,对于我这种初学者来说全是干货.简单的总结了一下,以后慢慢提炼. 关于Unity的架 ...
- ZooKeeper介绍,安装,配置文件解析
什么是ZooKeeper? ZooKeeper是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务. 所有这些类型的服务都以分布式应用程序以某种形式或另一种形式使用.每次实施时,都有很多工 ...