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. sqlServer将多字段设为主键方法

    补充一下关于数据库多字段复合主键的设置. 首先一个表是不能有多个主键的.但是可以有多个字段组合成一个主键,这就是为什么有时候表里为什么会有多个字段都有主键的标志,那是因为他们组合成了一个主键了.我们可 ...

  2. vim的全局替换

    本文出自   http://blog.csdn.net/shuangde800 本文是在学习<使用vi编辑器, Lamb & Robbins编著>时在所记的笔记. 本文内容: 基本 ...

  3. [PHP] find ascii code in string

    if (strpos($data ,chr(0x95)) !== false) { echo 'true'; }else{ echo "false"; }

  4. LeetCode刷题笔录Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  5. Python介绍、环境搭建(Eclipse插件)、第一个程序

    Python介绍 特点 优雅.明白.简单. 适合领域 1. Web站点和各种网络服务 2. 系统工具和脚本 3. 作为"胶水"语言把其它语言开发的模块包装起来方便使用 和其它语言对 ...

  6. IO负载高的来源定位 IO系列

    http://elf8848.iteye.com/category/281637 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到 ...

  7. java Map使用Object 做为Key的问题

    近期在看dnsjava 源码的时候,不经意间发现一个自己没有想过的问题: HashMap 如何使用key去查找对应的value的,这个问题很难用语言描述的清楚,那就使用代码来进行说明吧! public ...

  8. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  9. 多线程与Socket编程

    一.死锁 定义: 指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁 ...

  10. Linked Server for SQL Server 2012(x64) to Oracle Database 12c(x64)

    因为把两台数据库装了同一台机机器上,所以没有安装oracle Client的部分,Oracle部分使用netca创建的Net Service Name,使用tnsping以及登入方式的确认用户权限的以 ...