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

  1. BZOJ3624: [Apio2008]免费道路(最小生成树)

    题意 题目链接 Sol 首先答案一定是一棵树 这棵树上有一些0边是必须要选的,我们先把他们找出来,如果数量$\geqslant k$显然无解 再考虑继续往里面加0的边,判断能否加到k条即可 具体做法是 ...

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

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

  3. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

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

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

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

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

  6. P3623 [APIO2008]免费道路

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

  7. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  8. [APIO2008]免费道路

    [APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...

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

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

随机推荐

  1. 调研Android Studio开发环境的发展演变(附安装教程,多图)

    Android Studio(以下简称AS)第一次公开亮相是在2013年的谷歌I/O大会上,14年的大会上谷歌发布其试用测试版,如今AS已经历数次版本更新,功能十分强大.如(摘自百度百科Android ...

  2. 网络流量监控工具----iftop

    文章转自:http://www.vpser.net/manage/iftop.html.再次本人只是作为笔记使用,不做其他用途. 日常工作中用它来监控网卡的实时流量,(可以指定网段),反向解析IP.显 ...

  3. Mysql-字段类型

    首先统计所有,以表格查看 数字类型 列类型 需要的存储量 TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字节 BIG ...

  4. Java-异常Throwable,Exception,Error

      异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程. Java通过API中Throwable类的众多子类描述各种不同的 ...

  5. BZOJ-4300 绝世好(蛋疼)题 DP(递推)

    翻zky学长的blog时翻出来的..... 4300: 绝世好题 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 736 Solved: 393 [Sub ...

  6. Dedecms include\dialog\select_soft_post.php Upload Any Files To The Specified Directory Via Variable Not Initial Flaw Bypass Extension Defence

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 综合来说,这个漏洞的根源是"register_globals = on& ...

  7. java连接mysql(一)

    import java.sql.*; public class MysqlTest { public static void main(String[] args) throws SQLExcepti ...

  8. 腾讯云ubuntu下mysqli服务的开启

    腾讯云ubuntu下mysqli服务的开启 今天晚上搞了好久,在本地操作系统deepin下操作完全无需开启mysqli模块,自动就开启了.这次介绍一下服务器ubuntu下mysqli模块的开启. 首先 ...

  9. js中的全选,不选,和反选按钮的设定

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 高速公路(Highway,ACM/ICPC SEERC 2005,UVa1615)

    I think: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <m ...