【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
2011福建集训
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(0));freopen("2503data.out","w",stdout);int N=rand()%1000+1,M=rand()%50000+N;printf("%d %d\n",N,M);for (int i=1; i<=M; i++){int u=rand()%N+1,v=rand()%N;while (v==u) v=rand()%N;printf("%d %d\n",u,v); } return 0; }
数据生成器
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; inline int read() {int x=0; char ch=getchar();while (ch<'0' || ch>'9') {ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; 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]==0) 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=0; for (int i=1; 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=0,ans=0;//t记录熔点个数for (int i=1; 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=1; i<=N; i++)if (d[i]){if (d[i]&1) t++,vis[F(i)]=1;if (d[i]>2) ans++,mark[F(i)]=1;}for (int i=1; i<=N; i++)if (d[i] && i==F(i) && !vis[i] && num>1){t+=2;if (!mark[i]) ans++;}ans+=t>>1; printf("%d\n",ans);return 0; }
转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5850953.html
【BZOJ-2503】相框 并查集 + 分类讨论相关推荐
- Central Europe Regional Contest 2019 J. Saba1000kg (并查集+根号讨论)
链接:https://ac.nowcoder.com/acm/contest/7817/I 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...
- BZOJ 4668 冷战——并查集+LCA
基情链接♂BZOJ 1977 严格次小生成树--浅析最近公共祖先(LCA) 目录 一.题目:冷战 1.题目描述 2.输入 3.输出 4.样例输入 5.样例输出 二.题解 三.代码 谢谢! 一.题目 ...
- BZOJ 4668: 冷战 并查集暴力LCA(雾)
利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...
- LOJ:相框(欧拉回路、分类讨论)
解析 本题是一道if的板子题 抓住关键:使所有点的度数全变为2 首先对于度数大于2的点,把它分为若干2度点(和可能的一个单点) 现在我们只剩下单点和二度点了 接下来分来讨论一下 若有多个连通块,我们要 ...
- BZOJ 4668: 冷战 并查集
Time Limit: 10 Sec Memory Limit: 256 MB Submit: 440 Solved: 215 Description 1946 年 3 月 5 日,英国前首相温斯顿· ...
- POJ1417 True Liars ——种类并查集+01背包+路径** 好题
POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...
- BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...
- bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞
没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...
- 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)
这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...
最新文章
- 码云一个仓库只有一个项目吗_gitee码云完整使用教程(部署与克隆)
- 讲真,MySQL索引优化看这篇文章就够了
- 双目摄像头 三维坐标 python_时间编码单像素三维成像:挑战三维成像的速度极限...
- 微软.Net开发中的多线程编程总结
- CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表
- oracle给日期加特定天数,oracle按照日期求连续天数的数据sql
- Android开发实战——计算器
- 某丰快递分拣小程序-python字典
- 超定方程组和欠定方程组
- EtherCAT运动控制器的PLC编程(一) 直线插补
- php短信不同账号发,php用不同平台批量发短信
- 第一个开源小软件二维码批量生成工具
- 低版本的iphone 无法跑在xcode8上
- 麦田的守望者背景与分析
- 微信公众平台js算法逆向
- 秋天,小溪潺潺,古老的树上黄叶灿灿,阳光像一个魔法师,在树叶间流动,远山,云天,充满秋阳的光线。以此景观做一首诗...
- 滑动时固定在头部的一部分会变色(向下滑会变红)
- iconfont用在placeholder里
- 手机里隐藏了一个无限空间,可以永久保存照片视频,好多人不知道
- 大爷的 又被罚款100
热门文章
- win10 问题及优化 ssd
- DiscuzX34在本机安装配置
- 三年级计算机下册全册教案,清华版小学信息技术三年级下册全套教案.doc
- 26Play框架教程1学习笔记
- 计算机技能大赛广播稿,友谊第一比赛第二广播稿.doc
- fastboot刷机以及命令详细解说
- Android的ViewBinding
- 火狐浏览器所有历史版本下载地址
- gstreamer教程(二)-初始化_组件(Element)_箱柜(Bins)的使用
- java入门 常见问题0007:如何让JTextField文本框可以设置背景图像