2503: 相框

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 71  Solved: 31
[Submit][Status][Discuss]

Description

P大的基础电路实验课是一个无聊至极的课。每次实验,T君总是提前完成,管理员却不让T君离开,T君只能干坐在那儿无所事事。
先说说这个实验课,无非就是把几根导线和某些元器件(电阻、电容、电感等)用焊锡焊接起来。
为了打发时间,T君每次实验做完后都在焊接一些诡异的东西,这就是他的杰作:

T君不满足于焊接奇形怪状的作品,强烈的破坏欲驱使他拆掉这个作品,然后将之焊接成规整的形状。这会儿,T君正要把这个怪物改造成一个环形,当作自己的相框,步骤如下:

T君约定了两种操作:

1.      烧熔一个焊点:使得连接在焊点上的某些导线相分离或保持相连(可以理解为:把焊点上的导线划分为若干个类,相同类中的导线相连,不同类之间的导线相离)

2.      将两根导线的自由端(即未与任何导线相连的一端)焊接起来。

例如上面的步骤中,先将A点烧熔,使得导线1与导线2、4点分离;再将D点烧熔,使得4、5与3、7相离;再烧熔E,使7与6、8相离;最后将1、7相连。

T君想用最少的操作来将原有的作品改造成为相框(要用上所有的导线)。

Input

输入文件的第一行共有两个整数nm — 分别表示原有的作品的焊点和导线的数量 (0 ≤ n ≤ 1 000, 2 ≤ m ≤ 50 000)。焊点的标号为1~n。 接下来的m行每行共有两个整数 — 导线两端所连接的两个焊点的标号,若不与任何焊点相连,则将这一端标号为0。

原有的作品可能不是连通的。

某些焊点可能只有一根导线与之相连,在该导线的这一端与其他导线相连之前,这些焊点不允许被烧熔。

某些焊点甚至没有任何导线与之相连,由于T君只关心导线,因此这些焊点可以不被考虑。

Output

输出文件只包含一个整数——表示T君需要将原有的作品改造成相框的最少步数。

Sample Input

6 8
1 2
1 3
3 4
1 4
4 6
5 6
4 5
1 5

Sample Output

4

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】相框 并查集 + 分类讨论相关推荐

  1. Central Europe Regional Contest 2019 J. Saba1000kg (并查集+根号讨论)

    链接:https://ac.nowcoder.com/acm/contest/7817/I 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...

  2. BZOJ 4668 冷战——并查集+LCA

    基情链接♂BZOJ 1977 严格次小生成树--浅析最近公共祖先(LCA) 目录 一.题目:冷战 1.题目描述 2.输入 3.输出 4.样例输入 5.样例输出 二.题解 三.代码 ​ 谢谢! 一.题目 ...

  3. BZOJ 4668: 冷战 并查集暴力LCA(雾)

    利用并查集按秩合并,保存每个点合并的时间: 求时间时,就一直跳u=fa[u],并记录路径上时间的最大值,代表最后一次合并的时间 #include<cstdio> #include<i ...

  4. LOJ:相框(欧拉回路、分类讨论)

    解析 本题是一道if的板子题 抓住关键:使所有点的度数全变为2 首先对于度数大于2的点,把它分为若干2度点(和可能的一个单点) 现在我们只剩下单点和二度点了 接下来分来讨论一下 若有多个连通块,我们要 ...

  5. BZOJ 4668: 冷战 并查集

    Time Limit: 10 Sec Memory Limit: 256 MB Submit: 440 Solved: 215 Description 1946 年 3 月 5 日,英国前首相温斯顿· ...

  6. POJ1417 True Liars ——种类并查集+01背包+路径** 好题

    ​​​​​​POJ1417 题意: 有n行输入形如x, y, str,str为yes表示x说y是天使,str为no表示x说y不是天使(x, y为天使,恶魔的编号,1<=x,y<=p+q): ...

  7. BZOJ 2143 飞飞侠(线段树优化建边 / 并查集优化最短路)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2143 是 hydro 的 BZOJ ...

  8. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  9. 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)

    这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...

最新文章

  1. 码云一个仓库只有一个项目吗_gitee码云完整使用教程(部署与克隆)
  2. 讲真,MySQL索引优化看这篇文章就够了
  3. 双目摄像头 三维坐标 python_时间编码单像素三维成像:挑战三维成像的速度极限...
  4. 微软.Net开发中的多线程编程总结
  5. CCIE-LAB-第十二篇-EIGRP+EIGRP末节区域+leak map+分发列表
  6. oracle给日期加特定天数,oracle按照日期求连续天数的数据sql
  7. Android开发实战——计算器
  8. 某丰快递分拣小程序-python字典
  9. 超定方程组和欠定方程组
  10. EtherCAT运动控制器的PLC编程(一) 直线插补
  11. php短信不同账号发,php用不同平台批量发短信
  12. 第一个开源小软件二维码批量生成工具
  13. 低版本的iphone 无法跑在xcode8上
  14. 麦田的守望者背景与分析
  15. 微信公众平台js算法逆向
  16. 秋天,小溪潺潺,古老的树上黄叶灿灿,阳光像一个魔法师,在树叶间流动,远山,云天,充满秋阳的光线。以此景观做一首诗...
  17. 滑动时固定在头部的一部分会变色(向下滑会变红)
  18. iconfont用在placeholder里
  19. 手机里隐藏了一个无限空间,可以永久保存照片视频,好多人不知道
  20. 大爷的 又被罚款100

热门文章

  1. win10 问题及优化 ssd
  2. DiscuzX34在本机安装配置
  3. 三年级计算机下册全册教案,清华版小学信息技术三年级下册全套教案.doc
  4. 26Play框架教程1学习笔记
  5. 计算机技能大赛广播稿,友谊第一比赛第二广播稿.doc
  6. fastboot刷机以及命令详细解说
  7. Android的ViewBinding
  8. 火狐浏览器所有历史版本下载地址
  9. gstreamer教程(二)-初始化_组件(Element)_箱柜(Bins)的使用
  10. java入门 常见问题0007:如何让JTextField文本框可以设置背景图像