第一反应:这不先0后1做并查集就行了吗?

然后WA了。。。

哦。。。。啊?哦。。。233

如果按顺序做并查集,有些0的边可能很重要(只能由它作为0连起两个联通块),但并没有被选。

于是先按1做并查集,选出这些边,再按0,1做并查集。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 20050
#define maxe 100500
using namespace std;
int n,m,k,x,y,z,cnt0=,cnt1=,fath[maxv];
struct edge
{
int u,v;
}e0[maxe],e1[maxe];
bool vis[maxe],vis0[maxe],vis1[maxe];
void reset()
{
for (int i=;i<=n;i++)
fath[i]=i;
}
int getfather(int x)
{
if (x!=fath[x])
fath[x]=getfather(fath[x]);
return fath[x];
}
void focus()
{
reset();
for (int i=;i<=cnt1;i++)
{
int u=e1[i].u,v=e1[i].v;
int f1=getfather(u),f2=getfather(v);
if (f1!=f2) fath[f1]=f2;
}
for (int i=;i<=cnt0;i++)
{
int u=e0[i].u,v=e0[i].v;
int f1=getfather(u),f2=getfather(v);
if (f1!=f2) vis[i]=true;
}
}
bool kruskal()
{
reset();
int ret=;
for (int i=;i<=cnt0;i++)
{
if (vis[i])
{
int u=e0[i].u,v=e0[i].v;
int f1=getfather(u),f2=getfather(v);
if ((f1!=f2) && (ret<k))
{
ret++;vis0[i]=true;
fath[f1]=f2;
}
}
}
for (int i=;i<=cnt0;i++)
{
if (!vis[i])
{
int u=e0[i].u,v=e0[i].v;
int f1=getfather(u),f2=getfather(v);
if ((f1!=f2) && (ret<k))
{
ret++;vis0[i]=true;
fath[f1]=f2;
}
}
}
if (ret!=k) return false;
for (int i=;i<=cnt1;i++)
{
int u=e1[i].u,v=e1[i].v;
int f1=getfather(u),f2=getfather(v);
if (f1!=f2)
{
fath[f1]=f2;
ret++;vis1[i]=true;
}
}
if (ret!=n-) return false;
return true;
}
void print_e()
{
for (int i=;i<=cnt0;i++)
{
if (vis0[i])
printf("%d %d 0\n",e0[i].u,e0[i].v);
}
for (int i=;i<=cnt1;i++)
{
if (vis1[i])
printf("%d %d 1\n",e1[i].u,e1[i].v);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
if (!z)
{
cnt0++;
e0[cnt0].u=x;e0[cnt0].v=y;
}
else
{
cnt1++;
e1[cnt1].u=x;e1[cnt1].v=y;
}
}
focus();
if (!kruskal()) printf("no solution\n");
else print_e();
return ;
}

BZOJ 3624 免费道路的更多相关文章

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

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

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

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

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

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

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

  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. [APIO2008]免费道路

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

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

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

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

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

随机推荐

  1. LCT模板

    之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...

  2. D&F学数据结构系列——二叉排序树

    二叉排序树(Binary Sort Tree) 定义:对于树中的每个结点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值. 二叉查找树声明: #ifndef _ ...

  3. Office 2013 note

    1.每次打开重新配置: 问题表现:启动后发现每次打开都会出现“正在配置”的进度 执行:reg add HKCU\Software\Microsoft\Office\15.0\Word\Options ...

  4. Linux网络编程9——对TCP与UDP的简易封装2.0

    具体生成动态库的操作及使用该动态库的操作请参见上篇博文.以下仅仅列出改进版本的代码. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKE ...

  5. cojs QAQ的序列 解题报告

    QAQ 这是从论文上搬的一道题目 但是由于并没有找到题目地址,所以就自己造数据咯 发现数据无比难造 (本题数据极弱,暴力或可AC?) 我们考虑离线的话其实只需要莫队就可以了 那么在线怎么做呢 二进制分 ...

  6. TCP三次握手和四次挥手协议

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. TCP三次握手   所谓三次握手( ...

  7. JLINK固件丢失或升级固件后提示Clone的解决办法

    J-LINK V8固件烧录指导 J-LINK 是使用过程中,如果内部固件意外损坏或丢失,请参考下面操作步骤说明,重新烧录JLINK固件. 安装固件烧录软件 请ATMEL官方网址下载AT91-ISP下载 ...

  8. Centos环境下部署游戏服务器-编译

    游戏服务器是在windows环境开发的,相关跨平台的东西在这里不谈了,只谈如何将Visual Studio 工程转换到Linux下编译.这里涉及到的软件分别为:Centos版本为6.4,Visual ...

  9. Axure 注册码

    用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+tqEV4LG

  10. 详解TCP和UDP数据段的首部格式

    TCP数据段的首部格式: 源端口号(16) 目的端口号(16) 序列号(32) 确认应答号(32) 数据偏移(4) 保留(6) 代码位(6) 窗口(16) 校验和(16) 紧急指针 选项(长度可变) ...