解题:APIO 2008 免费道路
我们发现我们可以很容易知道最终完成的生成树中有多少鹅卵石路,但是我们不好得到这棵生成树的结构,所以我们尽量“谨慎”地完成生成树·,最好是一点点加到我们要达到的标准而不是通过删掉一些东西来完成
我们把水泥路视为权值为零,鹅卵石路视为权值为一,做最小生成树,这时加入在生成树里的鹅卵石路一定是必须加入的。再然后我们逆着做最小生成树做到恰好有$k$条鹅卵石路,然后用水泥路把图连通起来就好了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
struct a
{
int n1,n2;
int val,imp;
}mst[M],outp[N];
int aset[N],imp[N];
int n,m,c,k,rd,cnt;
bool cmp1(a x,a y)
{
return x.val<y.val;
}
bool cmp2(a x,a y)
{
return x.imp==y.imp?x.val>y.val:x.imp>y.imp;
}
int find(int x)
{
return x==aset[x]?x:aset[x]=find(aset[x]);
}
int main ()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&mst[i].n1,&mst[i].n2,&rd);
mst[i].imp=false,mst[i].val=rd^;
}
for(int i=;i<=n;i++) aset[i]=i;
sort(mst+,mst++m,cmp1);
for(int i=;i<=m;i++)
{
int f1=find(mst[i].n1),f2=find(mst[i].n2);
if(f1!=f2) aset[f1]=f2,mst[i].imp=mst[i].val;
}
for(int i=;i<=n;i++) aset[i]=i;
sort(mst+,mst++m,cmp2);
for(int i=;i<=m&&c<k;i++)
{
int f1=find(mst[i].n1),f2=find(mst[i].n2);
if(f1!=f2) aset[f1]=f2,c+=mst[i].val,outp[++cnt]=mst[i];
}
sort(mst+,mst++m,cmp1);
for(int i=;i<=m&&cnt<=n-;i++)
{
int f1=find(mst[i].n1),f2=find(mst[i].n2);
if(f1!=f2) aset[f1]=f2,c+=mst[i].val,outp[++cnt]=mst[i];
}
if(c!=k) printf("no solution\n"),exit();
for(int i=;i<=cnt;i++)
printf("%d %d %d\n",outp[i].n1,outp[i].n2,outp[i].val^);
return ;
}
解题:APIO 2008 免费道路的更多相关文章
- 免费道路 bzoj 3624
免费道路(1s 128MB)roads [输入样例] 5 7 21 3 04 5 13 2 05 3 14 3 01 2 14 2 1 [输出样例] 3 2 04 3 05 3 11 2 1 题解: ...
- 【bzoj3624】【apio2008】免费道路
2016/06/25 诸老师讲的图论,听了这道题很想写一下,但是看来要留到期末考后了. 07/01 有的标记是说生成树,有的是并查集...然而我只是觉得这棵奇怪的生成树蛮精妙的... 题目比较难过的只 ...
- [BZOJ3624][Apio2008]免费道路
[BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...
- 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 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- [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 ...
随机推荐
- File Transfer(并查集)
题目大意:将多个电脑通过网线连接起来,不断查询2台电脑之间是否连通. 问题来源:中国大学mooc 05-树8 File Transfer (25 分) We have a network of com ...
- 常用DOS指令备忘
1.删除整个目录,包括空目录 rd D:\管理\2012新同学练习\.svn /s/q /s 删除当前目录及子目录 /q 不询问直接删除 2.拷贝目录树 xcopy D:\管理\2012新同学练习 E ...
- JSON.stringify处理对象时的问题
1. JSON.stringify({entry_key: 'test', entry_detail: undefined}) 结果 为 "{"entry_key": & ...
- Python如何对折线进行平滑曲线处理?
在用python绘图的时候,经常由于数据的原因导致画出来的图折线分界过于明显,因此需要对原数据绘制的折线进行平滑处理,本文介绍利用插值法进行平滑曲线处理: 实现所需的库 numpy.scipy.mat ...
- Python mutilprocessing Processing 父子进程共享文件对象?
multiprocessing python多进程模块, 于是, Processing也是多进程的宠儿. 但今天讨论的问题, 似乎也能引起我们一番重视 直接上代码: 1 2 3 4 5 6 7 ...
- android点击事件的四种方式
android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...
- 软件工程-东北师大站-第七次作业(PSP)
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- UITableViewCell contentView layoutSubviews 死循环
发现一个问题,当在UITableViewCell 的 layoutSubviews 中修改 contentView 的frame时会产生死循环.该问题只会出现在iOS8中,iOS7与iOS9均没有问题 ...
- zabbix简介
(一)监控系统 初探 前言: 对于监控系统而言,首先必须搞清楚需要监控什么? (1)硬件设备和软件设备:服务器,路由器,交换机,I/O存储系统,操作系统,网络,各种应用程序 (2)各种指标:数据库宕机 ...
- TFTP服务 简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,默认端口号为69
(1)yum安装:tftp.tftp-server (2)启动tftp CentOS 6 service xinetd restart chkconfig tftp on CentOS 7 sys ...