【BZOJ-2503】相框 并查集 + 分类讨论
2503: 相框
Time Limit: 3 Sec Memory Limit: 128 MB
Submit: 71 Solved: 31
[Submit][Status][Discuss]
Description
T君不满足于焊接奇形怪状的作品,强烈的破坏欲驱使他拆掉这个作品,然后将之焊接成规整的形状。这会儿,T君正要把这个怪物改造成一个环形,当作自己的相框,步骤如下:
T君约定了两种操作:
1. 烧熔一个焊点:使得连接在焊点上的某些导线相分离或保持相连(可以理解为:把焊点上的导线划分为若干个类,相同类中的导线相连,不同类之间的导线相离)
2. 将两根导线的自由端(即未与任何导线相连的一端)焊接起来。
例如上面的步骤中,先将A点烧熔,使得导线1与导线2、4点分离;再将D点烧熔,使得4、5与3、7相离;再烧熔E,使7与6、8相离;最后将1、7相连。
T君想用最少的操作来将原有的作品改造成为相框(要用上所有的导线)。
Input
输入文件的第一行共有两个整数n和m — 分别表示原有的作品的焊点和导线的数量 (0 ≤ n ≤ 1 000, 2 ≤ m ≤ 50 000)。焊点的标号为1~n。 接下来的m行每行共有两个整数 — 导线两端所连接的两个焊点的标号,若不与任何焊点相连,则将这一端标号为0。
原有的作品可能不是连通的。
某些焊点可能只有一根导线与之相连,在该导线的这一端与其他导线相连之前,这些焊点不允许被烧熔。
某些焊点甚至没有任何导线与之相连,由于T君只关心导线,因此这些焊点可以不被考虑。
Output
输出文件只包含一个整数——表示T君需要将原有的作品改造成相框的最少步数。
Sample Input
1 2
1 3
3 4
1 4
4 6
5 6
4 5
1 5
Sample Output
HINT
30%的数据中n≤10。
100%的数据中n≤1000。
Source
Solution
想法很不错的一道题
答案和每个熔点的度数有关,显然最后情况是:所有边在一个连通块,且每个熔点的度=2
那么显然对于一个熔点,如果度数为0,显然可以扔掉;如果它的度数>2那么显然需要把他熔断,拆成很多小熔点,并且保证这些新的熔点<=2(优先=2,如果有剩余则=1),
然后我们就需要把各连通块合并,考虑两种情况:
1.所有边都在一个连通块中,那么我们只需要把度为1的新熔点两两合并。(最终期望合并成环)
2.所有边不都在一个连通块中,那这两个连通块一定都被熔合成链,然后把这些链熔合成大环
而第二种情况,就是使第一种情况的成环的成链,所以特殊处理一下
这里需要注意一下顺序:“我们要标记1是否拆分了点,因为如果拆分过点的话我们还可以拆分成两个度为1的点,和一堆度为2的点,这只用了一次操作,如果我们后拆的话会多一次操作,注意这里即可。 ”
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<ctime>
using namespace std;
int main()
{
srand(time());
freopen("2503data.out","w",stdout);
int N=rand()%+,M=rand()%+N;
printf("%d %d\n",N,M);
for (int i=; i<=M; i++)
{
int u=rand()%N+,v=rand()%N;
while (v==u) v=rand()%N;
printf("%d %d\n",u,v);
}
return ;
}
数据生成器
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
inline int read()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') {ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x;
}
#define MAXN 200010
int N,M;
int fa[MAXN],size[MAXN],d[MAXN];
inline int F(int x) {if (fa[x]==x || fa[x]==) return fa[x]=x; else return fa[x]=F(fa[x]);}
inline void Merge(int x,int y) {if (F(x)!=F(y)) fa[F(x)]=F(y);}
inline int GetNum() {int re=; for (int i=; i<=N; i++) if (F(i)==i && d[i]) re++; return re;}
bool vis[MAXN],mark[MAXN];//vis表示这个连通块是否需要合成链,mark表示这个连通块是否进行过拆分
int main()
{
N=read(),M=read();
int t=,ans=;//t记录熔点个数
for (int i=; i<=M; i++)
{
int u=read(),v=read();
if (!u) u=++N; d[u]++;
if (!v) v=++N; d[v]++;
Merge(u,v);
}
int num=GetNum();
for (int i=; i<=N; i++)
if (d[i])
{
if (d[i]&) t++,vis[F(i)]=;
if (d[i]>) ans++,mark[F(i)]=;
}
for (int i=; i<=N; i++)
if (d[i] && i==F(i) && !vis[i] && num>)
{
t+=;
if (!mark[i]) ans++;
}
ans+=t>>;
printf("%d\n",ans);
return ;
}
【BZOJ-2503】相框 并查集 + 分类讨论的更多相关文章
- CCCC L2-010. 排座位【并查集/分类讨论】
L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...
- bzoj 3237 连通图 - 并查集 - 线段树
Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connected Disconne ...
- hdu 并查集分类(待续)
hdu 1829 A Bug's Life 题目大意: 给你n个动物,输入m行a,b,表示a和b应该是异性的,要你判断是否有同性恋. 并查集中,1到n代表应性别,n+1到2n代表一个性别,合并一下,判 ...
- BZOJ 1050 旅行(并查集)
很好的一道题.. 首先把边权排序.然后枚举最小的边,再依次添加不小于该边的边,直到s和t联通.用并查集维护即可. # include <cstdio> # include <cstr ...
- BZOJ 1015 星球大战(并查集)
正着不好搞,考虑倒着搞.倒着搞就是一个并查集. # include <cstdio> # include <cstring> # include <cstdlib> ...
- BZOJ 4668: 冷战 并查集&&暴力LCA(雾)
利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...
- bzoj 4668 冷战——并查集结构
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 不路径压缩,维护并查集的树的结构,查询链上最大值.按秩合并就可以暴爬. #includ ...
- bzoj 4668 冷战 —— 并查集按秩合并
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4668 按秩合并维护并查集的树结构,然后暴力找路径上的最大边权即可. 代码如下: #inclu ...
- BZOJ 4668: 冷战 并查集启发式合并/LCT
挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...
随机推荐
- 启动PPT的时候一直配置vs2013的问题解决
前几天装了VS2013,结果发现每次启动powerpoint都要配置vs2013,虽然时间花的不多,可我看的就是碍眼,我都想把VS2013卸载来解决了.后来抱着试下的态度竟然在google上找到了解决 ...
- “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法
在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示 ...
- springmvc 通过异常增强返回给客户端统一格式
在springmvc开发中,我们经常遇到这样的问题:逻辑正常执行时返回客户端指定格式的数据,比如json,但是遇NullPointerException空指针异常,NoSuchMethodExcept ...
- 使用HttpWebRequest和HtmlAgilityPack抓取网页(拒绝乱码,拒绝正则表达式)
废话不多说, 直接说需求. 公司的网站需要抓取其他网站的文章,但任务没到我这,同事搞了一下午没搞出来.由于刚刚到公司, 想证明下自己,就把活揽过来了.因为以前做过,觉得应该很简单,但当我开始做的时候, ...
- Angular实现瀑布流的库angular-deckgrid
一. 安装 bower install --save angular-deckgrid 添加代码到你的HTML 添加到你的angular模块中: angular.module('your.module ...
- [转]Windows 8.1删除这台电脑中视频/文档/下载等六个文件夹的方法
Windows 8.1 已将“计算机”正式更名为“这台电脑”,当我们双击打开“这台电脑”后,也会很明显得发现另外一些变化:Windows 8.1 默认将视频.图片.文档.下载.音乐.桌面等常用文件夹 ...
- Social Emotional Computing -价值观的运算
第三节 价值观的运算 第三节 价值观的运算 由于价值观的客观本质就是事物的价值率,因此价值观的运算在客观本质上就是价值率的运算.由于价值观的运算就是为了揭示不同事物价值观之间的函数关系,因此价值观的 ...
- 【转】赶集网mysql开发36军规
原文链接:https://segmentfault.com/a/1190000004711147 写在前面的话:总是在灾难发生后,才想起容灾的重要性:总是在吃过亏后,才记得曾经有人提醒过. (一)核心 ...
- python表达式操作符【学习python必知必会】
运算符 描述 实例 yield x 生成器函数发送协议 lambda args: expression 生成匿名函数 x if y else z 三元选择表达式(c系列有的 python也要有 ...
- RabbitMQ官方中文入门教程(PHP版) 第四部分:路由(Routing)
路由(Routing) 在前面的教程中,我们实现了一个简单的日志系统.可以把日志消息广播给多个接收者. 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集.例如,我们只需要把严重的错误日 ...