相框
来源:互联网 发布:C语言 建立二叉树 编辑:程序博客网 时间:2024/05/17 01:18
题目描述
【问题描述】
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君想用最少的操作来将原有的作品改造成为相框(要用上所有的导线)。
【输入文件】
输入文件的第一行共有两个整数n和m:分别表示原有的作品的焊点和导线的数量 (0 ≤ n ≤ 1 000, 2 ≤ m ≤ 50 000)。焊点的标号为1~n。
接下来的m行每行共有两个整数:导线两端所连接的两个焊点的标号,若不与任何焊点相连,则将这一端标号为0。
原有的作品可能不是连通的。
某些焊点可能只有一根导线与之相连,在该导线的这一端与其他导线相连之前,这些焊点不允许被烧熔。
某些焊点甚至没有任何导线与之相连,由于T君只关心导线,因此这些焊点可以不被考虑。
【输出文件】
输出文件只包含一个整数:表示T君需要将原有的作品改造成相框的最少步数。
【输入样例1】
6 8
1 2
1 3
3 4
1 4
4 6
5 6
4 5
1 5
【输出样例1】
4
【输入样例2】
0 2
0 0
0 0
【输出样例2】
2
【输入样例3】
3 3
0 1
0 0
2 2
【输出样例3】
4
【数据规模和约定】
30%的数据中n≤10;
100%的数据中n≤1000。
欧拉回路:从一个点出发不重复经过边,又回到起点的路
欧拉通路:从一个点出发不重复经过边,不会到起点
当图中点均为偶数时,存在欧拉回路
欧拉图:存在欧拉回路的图
自环du+=2
首先考虑只有一个联通块
1.当联通块为一个简单环时,输出0
2.点度数均为偶数,这张图肯定是由多个欧拉回路组成的,考虑最后得到的答案是一个度数均为2的图,那么对于du>2 的点,把这些点通过一次熔断操作连接成一个简单环,对于这种情况的答案就是du>2的点个数
3.图中存在度数为奇数的点k个,先把图转化为第二种情况,对于奇数点,先熔断,再把分离出的度为1的点焊接,先考虑接起来的花费=k/2,转化为情况2后,+du>2的点个数(转化时的熔断花费包含在这里边)
多个连通块
每一个联通块肯定要转化为链再连接起来
对于上面的情况三,此时不需要把奇数点连起来,直接熔断成链就行了,也就是没有焊接的花费
每一个联通块都属于上述情况的一种
那么先单独考虑每个点,端点个数为num
du>2 必须要熔断ans++,其所在的联通块标记为拆分过
du&1转化为链后,肯定会作为一个链的端点num++; 其所在的联通块标记为拆分成链
本身是一个简单环的联通块,没有被拆分过,把它断成一条链的花费是1
最后再加上连接链的花费+num>>1
#include<iostream>#include<cstdio>#include<cstring>#define maxn 200005using namespace std;int n,m;struct edge{ int to,ne; }b[maxn*2];int k=0,head[maxn];int d[maxn];bool vis[maxn],mark1[maxn],mark2[maxn];int ans=0;int cnt=0,bl[maxn],tmp;void add(int u,int v){ k++; b[k].to=v; b[k].ne=head[u]; head[u]=k; }void dfs(int x){ vis[x]=1; bl[x]=cnt; for(int i=head[x];i!=-1;i=b[i].ne) if(!vis[b[i].to]) dfs(b[i].to);}void solve(){ cnt=0; for(int i=1;i<=n;i++) if(!vis[i]&&d[i]){ cnt++; dfs(i); } for(int i=1;i<=n;i++) { if(!d[i]) continue; if(d[i]&1){ tmp++; mark1[bl[i]]=1; } if(d[i]>2){ ans++; mark2[bl[i]]=1; } } if(cnt>1) for(int i=1;i<=cnt;i++){ if(!mark1[i]) tmp+=2; if(!mark2[i]&&!mark1[i]) ans++; } ans+=tmp>>1; printf("%d\n",ans);}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;}bool judge1(){ for(int i=1;i<=n;i++) if(d[i]!=2) return 0; return 1;}int main(){ //freopen("frame4.in","r",stdin); memset(head,-1,sizeof(head)); int x,y; n=read(); m=read(); for(int i=1;i<=m;i++){ x=read(); y=read(); if(!x) x=++n; if(!y) y=++n; add(x,y); add(y,x); d[x]++,d[y]++; } if(!n){ printf("%d\n",m); return 0; } solve(); return 0;}
- 相框
- AbsoluteLayout 相框
- cocos2dx源码:相框PhotoFrame
- Swift UIImageView 相框
- BZOJ 2503 相框 分类讨论
- BZOJ 2503 相框 并查集
- 全景图 相框 载入图案 局部上色
- 图论分类讨论 bzoj2503相框
- bzoj 2503 相框 欧拉回路
- [并查集 思路题] BZOJ 2503 相框
- 利用canvas制作图片(可缩放和平移)+相框+文字
- PHP图片处理类实现缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能
- PHP图片处理类实现缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色等功能
- 闹钟、相框、视讯通话、助眠神器,不务正业的Echo Spot才是智能音箱该有的样子
- pip加速器
- Valid Sudoku
- web移动端页面性能优化方案
- python.json/pygal.maps.world学习范例-读取json格式文件、生成世界地图
- 关于台式机如何在UEFI BIOS中开启VT
- 相框
- POD3260(单调队列优化)
- 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(3):反距离权重
- MySQL之多表
- java基本概念精简解读
- 一、(五)集合处理
- C/C++中的常量指针与指针常量
- java 中特殊的数据类型--string
- java中的文件操作:读取写入byte[]字节流、string字符串、list列表