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]免费道路的更多相关文章

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

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

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

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

  3. BZOJ 3624 [Apio2008]免费道路:并查集 + 生成树 + 贪心【恰有k条特殊路径】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3624 题意: 给你一个无向图,n个点,m条边. 有两种边,种类分别用0和1表示. 让你求一 ...

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

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

  5. BZOJ.3624.[APIO2008]免费道路(Kruskal)

    题目链接 我们发现有些白边是必须加的,有些是多余的. 那么我们先把所有黑边加进去,然后把必须要加的白边找出来. 然后Kruskal,把必须要加的白边先加进去,小于K的话再加能加的白边.然后加黑边. 要 ...

  6. bzoj 3624: [Apio2008]免费道路【生成树+贪心】

    先把水泥路建生成树,然后加鹅卵石路,这里加的鹅卵石路是一定要用的(连接各个联通块),然后初始化并查集,先把必需的鹅卵石路加进去,然后随便加鹅卵石路直到k条,然后加水泥路即可. 注意判断无解 #incl ...

  7. 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 这 ...

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

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

  9. P3623 [APIO2008]免费道路

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

随机推荐

  1. ionic中应用sass

    在学习ionic过程中看到sass,总结了一下基本用法和问题解决办法1.首先需要一个ionic项目,并执行下面的命令ionic start CustomSass blank && cd ...

  2. 【解决】使用compass watch xxx.scss 失败

    原始日期:2016-01-25 16:49 在上一篇博客,我们终于安装好了compass,不过紧接着使用compass watch app.scss 结果失败,经过查询资料,是compass的版本问题 ...

  3. 映射语句之INSERT语句

    1.一个 INSERT SQL 语句可以在<insert>元素在映射器 XML 配置文件中配置 例子: <insert id="insertStudentWithId&qu ...

  4. 百度地图 js api 实现 line 居中显示

    项目中有个需求需要在百度地图的中心显示画的线,以前用过mapPanto这个方法,传入坐标就可以将地图平移到这个坐标,不过不知道如何获取线的中心点,看了别人的代码,有以下两个函数可以实现这个功能 get ...

  5. 正则表达式去除字符串左右空格函数 调用方法是,str.Trim();

    正则表达式去除字符串左右空格函数 调用方法是,str.Trim(); String.prototype.Trim = function() { return this.replace(/(^\s*)| ...

  6. php中的捕获异常操作

    <?php if(!isset($_SESSION)){ session_start(); } include '../common/mysql.class.php'; include '../ ...

  7. session或memcache过期之后跳转到登陆页面并跳出iframe框架

    <!--在你想控制跳转的页面,比如login.html中的<head>与</head>之间加入以下代码:--> <script> if (window ...

  8. 如何用webpack实现自动化的前端构建工作流

    什么是自动化的前端构建流? 1. 自动补全css私有前缀,自动转化less\sass为css,自动转化es6\vue\jsx语法为js,自动打包小图片为base64以减少http请求,自动给js,cs ...

  9. mysql基础篇-----mysql简介

    2017-04-19 一.mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 ...

  10. Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

    1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; privat ...