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

我们简单画一画可以发现,整个的答案只与度有关。 
如果最后形成了一个环。 
那么环上的点的度一定为2 
不在环上的点则都为不连边的点,度一定为0 
我们一定要拆了所有度大于2的点。 
首先忽略所有度为0的点。 
现在考虑所有的边都在一个连通块内的情况。 
对于一个度大于2的点。 
如果他的度是奇数,那么一定拆成了一堆度为2的点与一个度为1的点。 
如果他的度是偶数,那么一定拆成了一堆度为2的点。 
拆完所有度大于2的点之后。 
度为1的点一定有偶数个,只需要每一次合并两个即可。 
然后我们考虑边不都在一个连通块的情况 
即度不为0的点构成了几个连通块。 
那么对于每一个连通块,我们一定是把这个连通块搞成有两个度为1的点,其余的块内点的度均为2。 
所以这时候与上一种情况有区别的是,上一种情况可能存在操作或者不操作后块内所有的点的度都为2,这时候我们要标记是否拆分了点,因为如果拆分过点的话我们还可以拆分成两个度为1的点,和一堆度为2的点,这只用了一次操作,如果我们后拆的话会多一次操作,注意这里即可。 
其余的正常做。

 #include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio> #define N 200007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,ans,blo;
int bel[N],flag[N],vis[N],du[N],odd[N];
int cnt,hed[N],rea[N],nxt[N]; void add(int u,int v)
{
nxt[++cnt]=hed[u];
hed[u]=cnt;
rea[cnt]=v;
}
void dfs(int u,int blo)
{
vis[u]=,bel[u]=blo;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (vis[v])continue;
dfs(v,blo);
}
}
int main()
{
memset(hed,-,sizeof(hed));
n=read(),m=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read();
if(x==)x=++n;
if(y==)y=++n;
add(x,y),add(y,x);
du[x]++,du[y]++;
}
for (int i=;i<=n;i++)
if (!vis[i]&&du[i]!=)
{
blo++;
dfs(i,blo);
}
for (int i=;i<=n;i++)
if (du[i]==)
{
odd[bel[i]]++;
if(odd[bel[i]]==) ans++,odd[bel[i]]=;
}
for (int i=;i<=n;i++)
{
if(!du[i])continue;
if(du[i]>)
{
ans++;
du[i]=(du[i]&?:);
if(du[i]==)
{
odd[bel[i]]++;
if(odd[bel[i]]==)ans++,odd[bel[i]]=;
}
else flag[bel[i]]=;
}
}
if(blo!=)
{
for (int i=;i<=blo;i++)
if (!odd[i]&&!flag[i])ans++;
ans+=blo;
}
else if (odd[]!=)ans++;
printf("%d\n",ans);
}

bzoj 2503 相框 分类讨论的更多相关文章

  1. bzoj 2503 相框——思路

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

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

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

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

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

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

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

  5. bzoj 3779 重组病毒 好题 LCT+dfn序+线段树分类讨论

    题目大意 1.将x到当前根路径上的所有点染成一种新的颜色: 2.将x到当前根路径上的所有点染成一种新的颜色,并且把这个点设为新的根: 3.查询以x为根的子树中所有点权值的平均值. 分析 原题codec ...

  6. Codeforces 460D Little Victor and Set --分类讨论+构造

    题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...

  7. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

  8. UVaLive 6862 Triples (数学+分类讨论)

    题意:给定一个n和m,问你x^j + y^j = z^j 的数量有多少个,其中0 <= x <= y <= z <= m, j = 2, 3, 4, ... n. 析:是一个数 ...

  9. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array 分类讨论连续递推dp

    题意:给出一个 数列 和一个x 可以对数列一个连续的部分 每个数乘以x  问该序列可以达到的最大连续序列和是多少 思路: 不是所有区间题目都是线段树!!!!!! 这题其实是一个很简单的dp 使用的是分 ...

随机推荐

  1. 软件杯python-flask遇到的坑有感!

    大三下,对于我考研的人来说,时间不要太紧张,参加软件杯也是系主任要求,题目是公共地点人流量的检测,个人还是个菜鸟,但是把遇到的一些大家可能不小心会出现的问题贴出来,困扰我很久,还没睡好觉!!! Que ...

  2. java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。

    package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...

  3. 2.3.3 zerosum 和为零

    #include<bits/stdc++.h> using namespace std; ],a; ]={' ','+','-'}; void out() { ;i<a;i++) c ...

  4. js判断是否是大小写,数字等方法

    function isEmail(str){ var regu = "^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*))@([a-zA-Z0-9- ...

  5. CentOS---zookeeper安装(单机、伪集群、集群)

    一:单机安装: 可以参考下面的伪集群安装方式 不同点: 不需要在data目录下创建 myid 文件 不需要配置集群 配置好后的启动和状态查询命令相同!! 二:伪集群模式 伪集群模式就是在同一主机上启动 ...

  6. 十、Linux vi/vim

    Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主 ...

  7. 基于 Generator 和 Iterator 的惰性列表

    初识 Lazy List 如果有了解过 Haskell 的朋友,对下面的这些表达一定不陌生 repeat 1 -- => [1, 1, 1, 1, 1,...] cycle "abc& ...

  8. 第15课 栏目的排序处理(组件化) Thinkphp5商城第四季

    目录 要实现的功能 思路: 视图层 控制器里: 扩展函数里 要实现的功能 用表单里的提交过来的sort数据,批量修改表里的排序值 界面效果: 思路: 视图层表单提交数据主键=>sort值 控制器 ...

  9. Python知识点入门笔记——特色数据类型(字典)

    Python中字典是一些列键 (key) 值 (value) 对组成的,形式如下 {键1:值1,键2:值:2} 每个键值对用冒号隔开,每对之间用逗号隔开 键必须是唯一的,必须是不可变的,如字符串,数字 ...

  10. [USACO]奶牛抗议(DP+树状数组+离散化)

    Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组 ...