这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力。

我们先分析题干信息。我们要形成相框,那么所有的点的度为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】相框 图论+讨论的更多相关文章

  1. bzoj 2503 相框 分类讨论

    题目大意:给定一张无向图,每次可以进行以下两种操作: 1.将一个点分裂成一些点,原先这个点连接的每条边任选一个新点进行连接 2.将两个度数为1的点合并为1个点 求将这个图变成一个环的最小操作次数 我们 ...

  2. bzoj 2503 相框——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 我也知道应该只关注度数. #include<iostream> #incl ...

  3. bzoj 1067 分情况讨论

    这道题考察人的严谨,各种情况分类讨论. #include <cstdio> #include <algorithm> #include <map> #define ...

  4. 【BZOJ-2503】相框 并查集 + 分类讨论

    2503: 相框 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 31[Submit][Status][Discuss] Desc ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4399  Solved: 1182 [Submit][Stat ...

  7. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

    BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1655  Solved: 798[Submit][S ...

  8. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil

    1177: [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1477  Solved: 589[Submit] Descri ...

  9. BZOJ 4086: [Sdoi2015]travel(SDOI2015 round2 day1)(分类讨论+容斥原理)

    描述:给定一张图(n<1000,m<5000)求有多少点对u,v有不重复经过其他点,共经过k个点的路径.(k<=7) 这个做法应该不是正解吧..顺便说下SDOI的几道题在BZ上都要卡 ...

随机推荐

  1. 微信小程序使用相机

    <view class="page-body"> <view class="page-body-wrapper"> <camera ...

  2. 洛谷 U45568 赌神:决斗

    题目描述 \mathcal{tomoo}tomoo决定与\mathcal{CYJian}CYJian进行决斗! 已知\mathcal{tomoo}tomoo有\mathcal{N}N张扑克牌,每张扑克 ...

  3. windows环境下,用python绘图库matplotlib绘图时中文乱码问题

    1.下载中文字体(看自己爱好就行)下面这个举例: SimHei - Free Font Download​www.fontpalace.co 2.下载之后,打开即可安装,将字体安装进windows系统 ...

  4. ruby File类

    类方法 路径相关: File.basename(filename <, suffix>) -> string返回给定文件名 filename 的最后一部分.如果有 suffix 参数 ...

  5. jmeter 插件安装

    1.下载Plugins Manager插件 打开下载插件地址:https://jmeter-plugins.org/ 2.将下载的plugins-manager.jar包复制到Jmeter安装目录,l ...

  6. 一个新晋IT行业的努力Duiker

      亲爱的朋友,你好!   我很开心能以这么一篇博客来开始我的IT努力之路.我叫Duiker,是一名软件工程专业的学生,想通过写博客来提升自己,充实自我. 首先,我要确立自己的学习编程目标: 1.将算 ...

  7. Andy's First Dictionary(uva 10815) set用法

    参考:https://www.cnblogs.com/yjlblog/p/6947747.html https://blog.csdn.net/hnust_taoshiqian/article/det ...

  8. Service ANR问题

    错误堆栈: ActivityManager: ANR in com.oppo.reader PID: 8071 Reason: executing service com.oppo.reade//co ...

  9. 『Golang』MongoDB在Golang中的使用(mgo包)

    有关在Golang中使用mho进行MongoDB操作的最简单的例子.

  10. Python中send()和sendall()的区别

    Python中send()和sendall()的区别 估计每个学习Python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原 ...