【BZOJ 2503】相框 图论+讨论
这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力。
我们先分析题干信息。我们要形成相框,那么所有的点的度为2(参与的点),那么所有度大于2的点都需要熔断,而且一次完成所有关于这个点的熔断,也就是说将一个焊点变成一堆度小于等于2的焊点,然后我们发现我们这个时候只需要焊接了。由此可知我们熔断的次数是一定的(除了简单环,度为2的点不需要熔断,因为这样做只会做负贡献),就好是熔断所有度大于2的点以及独立简单环,那么现在我们要做的就是让焊接次数最少,也就是分成较少的链。对于独立欧拉图不用讲就是一条,对于存在奇数入度的点的图,我们观察,他最少的条数就是奇点的个数除二,因为所有链(相互独立不可合并)的两端的点一定是奇数点(如果是偶数点意味着有其他端点对着他那么这条路径就可以删去了),然后我们再看他的可行性我们如果用奇数点除二的边将这些点互相连接,就会存在欧拉图那么我们在去掉我们加上的边就会的到那些条路径。
于是我们找联通块,(特别的如果我们的图是一个简单环就输出0,如果我们的图是一个欧拉图我们就是只熔断),对于欧拉图联通块我们化成一条链,(特别的对于简单环我们手动熔断),对半欧拉图我们把它化成奇数点除二条链。
于此注意细节便可A。
#include <cstdio>
#include <cstring>
const int N=;
const int M=;
struct V{
int to,next;
}c[M<<];
int head[M<<],t;
inline void add(int x,int y){
c[++t].to=y,c[t].next=head[x],head[x]=t;
}
int n,m,sz,size[M<<];
bool v[M<<];
inline bool judge(){
if(n!=sz)return false;
for(int i=;i<=n;++i)
if(size[i]!=)return false;
return true;
}
void dfs(int x,int &sum,int &is){
if(v[x])return;
v[x]=true,sum+=(x>n||(size[x]&))?:;
if(size[x]!=)is=;
for(int i=head[x];i;i=c[i].next)
dfs(c[i].to,sum,is);
}
inline int get(){
int ret=,first=-,sum=,ou=-;
for(int i=;i<=sz;++i)
if(v[i]==false&&(size[i]!=||i>n)){
int num=,is=;dfs(i,num,is);
++sum;
if(num==)ret+=+is;
else ret+=num>>;
if(first==-)first=num,ou=is;
}
for(int i=;i<=n;++i)
if(size[i]>)
++ret;
if(sum==&&first==&&ou==)ret=;
if(sum==&&first==)ret--;
return ret;
}
int main(){
scanf("%d%d",&n,&m),sz=n;
for(int i=,x,y;i<=m;++i){
scanf("%d%d",&x,&y);
if(x)size[x]++;
else x=++sz;
if(y)size[y]++;
else y=++sz;
add(x,y),add(y,x);
}
printf("%d",get());
return ;
}
【BZOJ 2503】相框 图论+讨论的更多相关文章
- bzoj 2503 相框 分类讨论
题目大意:给定一张无向图,每次可以进行以下两种操作: 1.将一个点分裂成一些点,原先这个点连接的每条边任选一个新点进行连接 2.将两个度数为1的点合并为1个点 求将这个图变成一个环的最小操作次数 我们 ...
- bzoj 2503 相框——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 我也知道应该只关注度数. #include<iostream> #incl ...
- bzoj 1067 分情况讨论
这道题考察人的严谨,各种情况分类讨论. #include <cstdio> #include <algorithm> #include <map> #define ...
- 【BZOJ-2503】相框 并查集 + 分类讨论
2503: 相框 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 71 Solved: 31[Submit][Status][Discuss] Desc ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4399 Solved: 1182 [Submit][Stat ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
1177: [Apio2009]Oil Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1477 Solved: 589[Submit] Descri ...
- BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)
描述:给定一张图(n<1000,m<5000)求有多少点对u,v有不重复经过其他点,共经过k个点的路径.(k<=7) 这个做法应该不是正解吧..顺便说下SDOI的几道题在BZ上都要卡 ...
随机推荐
- 微信小程序scroll-viwe遇到的问题
1.当使用scroll-view的时候里面不可以使用某些标签 2.当使用scroll-view的时候会出现,子元素中滑动的时候会出现滚动的情况,我遇到的是因为view设置了高度和行高,一旦设置了这个, ...
- 【Js】Jquery遍历-each(function(e){})中的e和$(this)的区别
$("selector").each(function(e){ console.log($(e)); console.log($(this)); console.log(e); c ...
- Java基础——继承和多态
面向对象的编程允许从已经存在的类中定义新的类,这称为继承. 面向过程的范式重点在于方法的设计,而面向对象的范式将数据和方法结合在对象中.面向对象范式的软件设计着重于对象以及对象上的操作.面向对象的方法 ...
- echarts实用小技巧,控制字符串长度,限定整数等
限定横坐标文本字符长度 xAxis : [ axisLabel:{ formatter: function (value) { var maxlength=6; if (value.length> ...
- C语言实例解析精粹学习笔记——33(扑克牌的结构表示)
实例33: 使用“结构”定义一副扑克牌,并对变量赋值,输出结果 思路: 扑克牌有4种花色,用枚举类型表示花色,其他都是结构体的简单应用 程序代码: #include <stdio.h> # ...
- Nodejs模块初始化
模块初始化 一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程中初始化模块的导出对象.之后,缓存起来的导出对象被重复利用. 主模块 通过命令行参数传递给NodeJS以启动程序的模块被称为 ...
- go学习笔记-基础类型
基础类型 布尔值 布尔值的类型为bool,值是true或false,默认为false. //示例代码 var isActive bool // 全局变量声明 var enabled, disabled ...
- python2.7入门---面向对象
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.所以,这篇文章我们来记录下Python的面向对象编程.如果你以前没有接触过面向对象的编 ...
- 【转】手把手教你:Ubuntu14+apache2+django1.7+python2.7下网页/网站部署
本人亲自尝试了网上众多的部署网页/网站方法,绝大多数都未能试验成功,这次的项目光部署这块遇到了很多问题,大概耗费了我一个星期. 本着:王道论坛中的赠人玫瑰,手留余香的精神.我把自己一路所走的历程发布出 ...
- Java技术——I/O知识学习
个字节,主要用在处理二进制数据,字节用来与文件打交道,所有文件的储存都是通过字节(byte)的方式,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘.在读取文件(特别是文本文 ...