题面

我们发现我们可以很容易知道最终完成的生成树中有多少鹅卵石路,但是我们不好得到这棵生成树的结构,所以我们尽量“谨慎”地完成生成树·,最好是一点点加到我们要达到的标准而不是通过删掉一些东西来完成

我们把水泥路视为权值为零,鹅卵石路视为权值为一,做最小生成树,这时加入在生成树里的鹅卵石路一定是必须加入的。再然后我们逆着做最小生成树做到恰好有$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 免费道路的更多相关文章

  1. 免费道路 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 题解: ...

  2. 【bzoj3624】【apio2008】免费道路

    2016/06/25 诸老师讲的图论,听了这道题很想写一下,但是看来要留到期末考后了. 07/01 有的标记是说生成树,有的是并查集...然而我只是觉得这棵奇怪的生成树蛮精妙的... 题目比较难过的只 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. P3623 [APIO2008]免费道路

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

随机推荐

  1. 关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决

    问题:在队友发来的项目中想将他获取到的数据通过数据库储存,出现驱动加载失败问题 解决:首先百度了下相关情况,大多数都是说下载mysql-connector-java-5.1.39-bin.jar包,然 ...

  2. 二、Django快速安装

    一.安装Python 作为一个Python Web框架,Django依赖Python.从Django适用于哪些版本的Python可以获取更多信息.较新版本的Python内置一个轻量级的数据库SQLit ...

  3. [转]50 Tips for Working with Unity (Best Practices)

    About these tips These tips are not all applicable to every project. They are based on my experience ...

  4. css各种鼠标手型集合

    比较齐全的鼠标手型css在国内的网站上是没搜到这么全的比如说哪个禁止的手型:鼠标往下移动即可看到效果: html代码如下: <h1>Cursors</h1> <div c ...

  5. 二维DCT变换

    DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...

  6. wepy中如何使用stylus等样式预处理器

    wepy中如何使用stylus等样式预处理器 一.如何在wepy中使用stylus 1.安装wepy-compiler-stylus(以及stylus, stylus-loader) npm inst ...

  7. php-fpm配置

    [global] error_log = /letv/log/php-fpm_error.log [www] user = apache group = apache listen = 127.0.0 ...

  8. 7. I/O复用

    一.I/O复用的特点 能同时监听多个文件描述符 自身是阻塞的 当多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符 由于其第三个特点,所以服务器程序看起来仍 ...

  9. 关于jsp之间href传参(中文)乱码问题

    在A.jsp中有href传值 <a href=\"6.jsp?param="+rs.getString(2)+"\">" 在B.jsp中使 ...

  10. vs中如何使用NuGet

    在vs中如何打开NuGet? 1.工具→NuGet程序包管理器→程序包管理控制台 2.没有的话,就去  工具→扩展和更新   搜索nuget 如果你点击工具,没看到Nuget这些字样,请注意汉化名字为 ...