[BZOJ3624][Apio2008]免费道路
[BZOJ3624][Apio2008]免费道路
试题描述
输入
输出
输入示例
输出示例
数据规模及约定
见“输入”。
题解
第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入的 c = 0 的边。
第二步,加入那些必须加入的 c = 0 的边,尽量加入 c = 0 的边直到这种边数量达到 k,再加入 c = 1 的边直到形成一棵树。
最后判一判 no solution 的情况。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 20010
#define maxm 100010
int n, m, k;
struct Edge {
int u, v;
bool c, has;
void get() {
u = read(); v = read(); c = read(); has = 0;
return ;
}
} es[maxm]; int fa[maxn];
void init() { for(int i = 1; i <= n; i++) fa[i] = i; return ; }
int findset(int x) { return x == fa[x] ? x : fa[x] = findset(fa[x]); } int main() {
n = read(); m = read(); k = read();
for(int i = 1; i <= m; i++) es[i].get(); init();
for(int i = 1; i <= m; i++) if(es[i].c) {
int u = findset(es[i].u), v = findset(es[i].v);
if(u != v) fa[v] = u;
}
for(int i = 1; i <= m; i++) if(!es[i].c) {
int u = findset(es[i].u), v = findset(es[i].v);
if(u != v) fa[v] = u, es[i].has = 1;
}
int cnt = 0;
init();
for(int i = 1; i <= m; i++) if(es[i].has) fa[findset(es[i].v)] = findset(es[i].u), cnt++;
for(int i = 1; i <= m && cnt < k; i++) if(!es[i].c) {
int u = findset(es[i].u), v = findset(es[i].v);
if(u != v) fa[v] = u, es[i].has = 1, cnt++;
}
for(int i = 1; i <= m; i++) if(es[i].c) {
int u = findset(es[i].u), v = findset(es[i].v);
if(u != v) fa[v] = u, es[i].has = 1;
} if(cnt != k) puts("no solution");
else for(int i = 1; i <= m; i++) if(es[i].has) printf("%d %d %d\n", es[i].u, es[i].v, es[i].c); return 0;
}
[BZOJ3624][Apio2008]免费道路的更多相关文章
- BZOJ3624: [Apio2008]免费道路(最小生成树)
题意 题目链接 Sol 首先答案一定是一棵树 这棵树上有一些0边是必须要选的,我们先把他们找出来,如果数量$\geqslant k$显然无解 再考虑继续往里面加0的边,判断能否加到k条即可 具体做法是 ...
- bzoj 3624: [Apio2008]免费道路 生成树的构造
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 111 Solved: 4 ...
- 题解 Luogu P3623 [APIO2008]免费道路
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- BZOJ 3624: [Apio2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1201 Solved: ...
- [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 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- [APIO2008]免费道路
[APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...
- [APIO2008]免费道路(生成树)
新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可能保持所有道路免费.为此亟待制定一个新的 ...
随机推荐
- [USACO2004][poj2373]Dividing the Path(DP+单调队列)
http://poj.org/problem?id=2373 题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各A到B的区域,一只奶牛吃草 ...
- 大型网站系统架构实践(六)深入探讨web应用集群Session保持
原理 在第三,四篇文章中讲到了会话保持的问题,而且还遗留了一个问题,就是会话保持存在单点故障, 当时的方案是cookie插入后缀,即haproxy指负责分发请求,应用服务自行保持用户会话,如果应 用服 ...
- DDD 领域驱动设计-看我如何应对业务需求变化?
tks: http://www.cnblogs.com/xishuai/p/3972802.html
- javascript函数自调用
1. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 2. 将函数用 “()”括起来, 后面再加一个“()” 3. javascript函数的内置对象arguments对象, 它包 ...
- Java基础-数据类型转换
1).简单类型数据间的转换,有两种方式:自动转换和强制转换,通常发生在表达式中或方法的参数传递时. 自动转换 当一个较"小"数据与一个较"大"的数据一起运算 ...
- 从Yii2的Request看其CSRF防范策略
用ajax请求还是用命令行CURL请求总是会得到 http400:Bad Request的错误, 而如果用Web网页方式GET访问(去除verbFilter的POST限制),是正常的,是CSRF验证的 ...
- 在Ubuntu下安装*.sh
在Ubuntu下安装*.sh和*.bin的方法 [日期:2009-12-07] 来源:Linux公社 作者:Linux编辑 [字体:大 中 小] 记下在Ubuntu下安装*.sh和*.bin的简 ...
- 【poj3177】 Redundant Paths
http://poj.org/problem?id=3177 (题目链接) 题意 给出一个n个节点m条边的无向图,求最少连几条边使图中没有桥. Solution 我们可以发现,用最少的边使得图中没有桥 ...
- groovy-闭包
什么是闭包 一个groovy闭包就像一个代码块或者方法指针,他是定义然后执行的一段代码,但是他有一些特性:隐含变量,支持自由变量,支持currying . 我们先来看看一些例子: 1 def clos ...
- pthread_create线程创建的过程剖析
http://blog.csdn.net/wangyin159/article/details/47082125 在Linux环境下,pthread库提供的pthread_create()API函数, ...