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 ...
随机推荐
- oracle学习笔记(1)-三级模式SCHEMA
oracle三级模式及二级映像 模式(schema)是数据库的一个名词,大部分的数据库在结构上都有三级模式的特征,了解下基本的概念,有助于后续深入的学习. 用老罗坚果pro发布会的话说就是,不罗嗦,先 ...
- 记一次服务器Tomcat优化经历
公司需要一台测试服务器来做测试用,所以花了几天时间把服务全部部署好,在部署好war包之后,发现Tomcat访问超级慢. 1.进入Tomcat的bin目录下,运行 ./catalina.sh run命令 ...
- web开发中前后端传值
在JavaScript中,页面与页面间的传值需要注意. 比如,我们通过url向下个页面进行传一个数字时,到下个页面进行解析出来后可能是一个字符串.这样会导致一个现象.调试时,发现我要传的值的确传过来了 ...
- php数组根据某键值,把相同键值的合并最终生成一个新的二维数组
<?php $a=array( '0'=>array( 'id'=>'1', 'names'=>'jack', '0'=>'sendone' ), '1'=>arr ...
- 2.如何实现使用VBS脚本程序对直播间自动评论
前言:本文使用的是VBS脚本,实现了对繁星直播自动登录,自动进入房间并且自动评论. 前提准备:把需要刷的评论放到mysql中,再使用vbs读出评论 -------------------------- ...
- EXT 结构解析
EXT Demo 结构解析 创建项目 sencha -sdk F:\lib\ext-6.0.0 generate app demo F:\demo 预览项目 执行命令 sencha app build ...
- ionic项目结构解析
ionic项目结构解析 原始结构 创建一个IonicDemo项目 'ionic start IonicDemo sidemenu' 这种结构多模块开发比较麻烦,因为view跟controller分开路 ...
- 【Socket】Java Socket基础编程
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- 如何使用slice,substr代替substring(原创)
//写这个是为了加深对substring和slice的理解 substring: 任何一个参数小于0,都会被替换成0.两个参数,最小值会被当做start,最大值当做end. 参数 描述 start 必 ...
- Photoshop制作雪碧图技巧
雪碧图,就是将网页制作中使用的多个小图片合并成一个图片,使用css技术将这张合成的图片应用在网页不同的地方. 雪碧图可以减少网页加载时的http请求数,优化网页性能. 步骤: a.使用Photosho ...