3624: [Apio2008]免费道路

Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special Judge
Submit: 111  Solved: 49
[Submit][Status]

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
 
  还是看的网上的标程。。。。。
  这道题的做法是先1边优先,做生成树,如果0边个数大于k无解,否则随便假如能加的0边补足k条,剩下由1边补足。
  这个怎么证明呢?我们考虑第一遍找出的0边最少的生成树,当我们随机加入一条0边,保证不存在0边环,那么我们都能删去一个1边,这个由第一颗生成树尽量加入1边的性质可得,那么以上的做法就可以理解了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 1000010
struct edge
{
int x,y;
};
vector<edge> v0,v1;
bool vis0[MAXN],vis1[MAXN];
int uf[MAXN];
int get_fa(int now)
{
return (uf[now]==now)?now:uf[now]=get_fa(uf[now]);
}
bool comb(int x,int y)
{
x=get_fa(x);
y=get_fa(y);
if (x==y)return ;
uf[x]=y;
return ;
}
int main()
{
freopen("input.txt","r",stdin);
int n,m,i,j,k,x,y,z;
int cnt=;;
int tot=;
scanf("%d%d%d",&n,&m,&k);
edge et;
for (i=;i<=n;i++)
uf[i]=i;
for (i=;i<m;i++)
{
scanf("%d%d%d",&et.x,&et.y,&z);
if (z)
v1.push_back(et);
else
v0.push_back(et);
}
for (i=;i<v1.size();i++)
{
comb(v1[i].x,v1[i].y);
}
for (i=;i<v0.size();i++)
{
vis0[i]=comb(v0[i].x,v0[i].y);
cnt+=vis0[i];
}
if (cnt>k)
{
printf("no sulotion\n");
return ;
}
for (i=;i<=n;i++)
uf[i]=i;
for (i=;i<v0.size();i++)
{
if (vis0[i])
comb(v0[i].x,v0[i].y);
}
for (i=;i<v0.size();i++)
{
if (cnt==k)break;
if (vis0[i])continue;
vis0[i]=comb(v0[i].x,v0[i].y);
cnt+=vis0[i];
}
for (i=;i<v1.size();i++)
{
vis1[i]=comb(v1[i].x,v1[i].y);
}
for (i=;i<v0.size();i++)
if (vis0[i])
tot++;
for (i=;i<v1.size();i++)
if (vis1[i])
tot++;
if (cnt!=k || tot!=n-)
{
printf("no solution\n");
return ;
}
for (i=;i<v0.size();i++)
if (vis0[i])
printf("%d %d %d\n",v0[i].x,v0[i].y,);
for (i=;i<v1.size();i++)
if (vis1[i])
printf("%d %d %d\n",v1[i].x,v1[i].y,);
}
 

bzoj 3624: [Apio2008]免费道路 生成树的构造的更多相关文章

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

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

  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]免费道路【生成树+贪心】

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

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

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

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

  7. [APIO2008]免费道路(生成树)

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

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

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

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

随机推荐

  1. 利用Ajax把前端的数据封装成JSON格式发送到服务器端并写成XML格式在服务器的硬盘上

    1.首先要在前端把要发送的东西(这里是一个实例化的car对象)都准备好,利用Ajax发送到服务器端,代码如下: <html xmlns="http://www.w3.org/1999/ ...

  2. 聊聊 KVC 和 KVO 的高阶应用

    KVC, KVO 作为一种魔法贯穿日常Cocoa开发,笔者原先是准备写一篇对其的全面总结,可网络上对其的表面介绍已经够多了,除去基本层面的使用,笔者跟大家谈下平常在网络上没有提及的KVC, KVO进阶 ...

  3. PHP-popen()&nbsp;函数打开进程文件指针

    待更新 版权声明:本文为博主原创文章,未经博主允许不得转载.

  4. vim 编辑器笔记

    vim 编辑器 命令模式(默认),尾行模式 : / 两种方式 (Esc比较慢,连续连词esc,删除全部尾行内容),编辑模式 a,i,o,s :q 退出编辑不保存 :wq 保存编辑并退出 :w 保存并写 ...

  5. SVN服务器的搭建 分类: 网络 2014-11-27 01:18 204人阅读 评论(4) 收藏

    一.首先来下载和安装SVN服务器 现在Subversion已经迁移到apache网站上了,下载地址: http://subversion.apache.org/packages.html 这是二进制文 ...

  6. 在picture library中取某一图片的大图、小图

    public static string GetPicThumbnail(SPFile file, string type) {     string thumbnail = "" ...

  7. c语言学习之基础知识点介绍(六):if和switch结构

    本节主要说c语言中的分支结构. c语言中分支结构有两大类:一种是if,一种是switch. 一.if结构 //if结构,语法: //第一种: if(表达式){ //语句块 } //第二种: if(表达 ...

  8. A题笔记(3)

    No. 1381 容器相关 #include <vector> 头文件 vector<Presents> present; present.push_back(name); 向 ...

  9. Hibernate session flush

    最近做项目时,用到了hibernnate,批量删除10000条数据时,删除时前台将id传到后台,用in匹配去删除,页面直接卡死. 解决方法,将传过来的10000条id分批删除,每删除五百条后,调用ge ...

  10. PLSQL常用时间函数

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...