[APIO2008]免费道路

BZOJ

luogu

先把必须连的鹅卵石路连上,大于k条no solution

什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连

补全到k条鹅卵石路,补不全no solution

最后用水泥路构出生成树,构不出no solution

#include<bits/stdc++.h>
using namespace std;
const int _=1e5+5;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
bool vis[_];
int n,m,k,cnt,fa[_],ans[_];
struct edge{int u,v,c;}e[_];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void unite(int x,int y){
x=find(x);y=find(y);
if(x^y)fa[x]=y;
}
int main(){
n=re(),m=re(),k=re();
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
int u=re(),v=re(),c=re();
e[i]=(edge){u,v,c};
if(c)unite(u,v);
}
for(int i=1;i<=m;i++){
if(find(e[i].u)^find(e[i].v)){
unite(e[i].u,e[i].v);
ans[++cnt]=i;vis[i]=1;
}
}
if(cnt>k){puts("no solution");return 0;}
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=cnt;i++)
unite(e[ans[i]].u,e[ans[i]].v);
for(int i=1;i<=m;i++){
if(e[i].c||vis[i])continue;
if(find(e[i].u)^find(e[i].v)){
unite(e[i].u,e[i].v);
ans[++cnt]=i;
if(cnt==k)break;
}
}
if(cnt<k){puts("no solution");return 0;}
for(int i=1;i<=m;i++){
if(!e[i].c)continue;
if(find(e[i].u)^find(e[i].v)){
unite(e[i].u,e[i].v);
ans[++cnt]=i;
if(cnt==n-1)break;
}
}
if(cnt<n-1){puts("no solution");return 0;}
for(int i=1;i<n;i++)
printf("%d %d %d\n",e[ans[i]].u,e[ans[i]].v,e[ans[i]].c);
return 0;
}

[APIO2008]免费道路的更多相关文章

  1. [BZOJ3624][Apio2008]免费道路

    [BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...

  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]免费道路(生成树)

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

  9. 【bzoj3624】Apio2008—免费道路

    http://www.lydsy.com/JudgeOnline/problem.php?id=3624 (题目链接) 题意 给出一张无向图,其中有0类边和1类边.问能否构成正好有K条0类边的生成树, ...

随机推荐

  1. mysql二进制安装及基础操作

    mysql二进制安装及基础操作 环境说明: 系统版本    CentOS 6.9 x86_64 软件版本    mysql-5.6.36-linux-glibc2.5-x86_64 1.安装 采用二进 ...

  2. [PWA] Add Push Notifications to a PWA with React in Chrome and on Android

    On Android and in Chrome (but not on iOS), it's possible to send push notifications with a PWA. We'l ...

  3. iOS_block代码块

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  4. MyBatis Generator生成DAO——序列化

    MyBatis Generator生成DAO 的时候,生成的类都是没有序列化的. 还以为要手工加入(開始是手工加入的),今天遇到分页的问题,才发现生成的时候能够加入插件. 既然分页能够有插件.序列化是 ...

  5. pip 安装自己开发模块 边调试边修改

    pip install -e /path/to/mypackage

  6. centos内核基本调优

    一.内核(/etc/sysctl.conf) 1.加大端口号范围net.ipv4.ip_local_port_range = 10240 65000 2.tcp/ip重用及超时限制net.ipv4.t ...

  7. ubuntu安装rpm格式软件包

    转载自:http://os.51cto.com/art/200708/53942.htm ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb.用alien转 ...

  8. 事务(Transaction)概念和特性

    http://baike.baidu.com/view/121511.htm 概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库 ...

  9. 排序算法 C++代码实现

    插入排序: 就像摸牌,摸一张插进去,找一个哨兵.从第二个開始,和前一个比較.小的话前移一位. #include <iostream> #include<stdlib.h> us ...

  10. [django] 利用多线程添加异步任务

    看到django异步大家的反应应该是celery这样的消息队列组件.如今用的最多的最推荐的也是这样的方式.然而我这需求就是请求来了,运行一个小程序.可是又不能确定这个小程序啥时候运行完.响应又要及时, ...