bzoj 2503 相框——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503
我也知道应该只关注度数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=;
int n,m,deg[N],sum,ans;
int main()
{
scanf("%d%d",&n,&m);int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
deg[x]++;deg[y]++;
sum+=(!deg[x])+(!deg[y]);//焊接
}
for(int i=;i<=n;i++)
{
if(deg[i]>)ans+=deg[i]/-+(deg[i]&);//烧熔
sum+=(deg[i]&);//焊接
}
printf("%d",ans+(sum>>));
return ;
}
秒WA
应该仔细读题,那个不用deg[ i ]/2 - 1 + (deg[ i ] & 1),一次就能焊好;
而且还没管不同连通块。
TJ:http://www.cnblogs.com/TSHugh/p/7617699.html
需要记一下一个连通块里有没有奇度数的点,因为对于没有的要手动熔断。这时要特判是不是只有一个连通块。
学习TJ代码:https://blog.csdn.net/PoPoQQQ/article/details/48031135
终于发现一次就能把一个点熔好了。还记录了一个连通块有没有被熔过。就因为一次也能顺便熔出两个奇度数点,所以对于没有奇度数点的连通块要通过这个判断是否需要再熔一次。
还学习了TJ的好写法:读入的时候不用区分0的端点什么的,++n就好了!仔细想一想是等价的。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=5e4+;
int n,m,deg[N],fa[N],jd,ans,yf,cnt;
bool tag[N],cz[N];
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
int main()
{
scanf("%d%d",&n,&m);int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(!x)x=++n;if(!y)y=++n;//!!!
deg[x]++;deg[y]++;fa[find(x)]=find(y);
// if(!x&&!y)jd+=2;
// else if(x&&y)deg[x]++,deg[y]++,fa[find(x)]=find(y);
// else{
// jd++;if(x)deg[x]++;if(y)deg[y]++;
// }
}
for(int i=;i<=n;i++)
{
if(deg[i]&)jd++,tag[find(i)]=;
if(deg[i]>)ans++,cz[find(i)]=;//记录cz!//一次就能熔好!!!!!
if(deg[i]&&fa[i]==i)cnt++;//deg[i]!!
}
if(cnt==&&!jd){printf("0\n");return ;}
for(int i=;i<=n;i++)
if(fa[i]==i&&!tag[i]&&cnt>)
{
if(!cz[i])ans++;
jd+=;//&&cnt>1!
}
printf("%d\n",ans+(jd>>));
return ;
}
秒WA
再次学习(抄)了一遍。
别忘了到处判断deg[ i ]!!!别忘了把数组调大,赋 fa[ ] 的时候也要调大范围!
虽然A了可是一点也不高兴怎么办……
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=,M=5e4+,Lm=1e5+1e3+;;
int n,m,deg[Lm],fa[Lm],jd,ans,cnt;
bool tag[Lm],cz[Lm];
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
int main()
{
scanf("%d%d",&n,&m);int x,y;
for(int i=;i<=Lm-;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(!x)x=++n;if(!y)y=++n;//!!!
deg[x]++;deg[y]++;fa[find(x)]=find(y);
// if(!x&&!y)jd+=2;
// else if(x&&y)deg[x]++,deg[y]++,fa[find(x)]=find(y);
// else{
// jd++;if(x)deg[x]++;if(y)deg[y]++;
// }
}
for(int i=;i<=n;i++)
{
if(deg[i]&)jd++,tag[find(i)]=;
if(deg[i]>)ans++,cz[find(i)]=;//记录cz!//一次就能熔好!!!!!
if(deg[i]&&find(i)==i)cnt++;//deg[i]!!
}
// if(cnt==1&&!jd){printf("0\n");return 0;}
for(int i=;i<=n;i++)
if(deg[i]&&find(i)==i&&!tag[i]&&cnt>)//deg[i]!!!
{
if(!cz[i])ans++;
jd+=;//&&cnt>1!
}
printf("%d\n",ans+(jd>>));
return ;
}
bzoj 2503 相框——思路的更多相关文章
- bzoj 2503 相框 分类讨论
题目大意:给定一张无向图,每次可以进行以下两种操作: 1.将一个点分裂成一些点,原先这个点连接的每条边任选一个新点进行连接 2.将两个度数为1的点合并为1个点 求将这个图变成一个环的最小操作次数 我们 ...
- 【BZOJ 2503】相框 图论+讨论
这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力. 我们先分析题干信息.我们要形成相框,那么所有的点的度为2(参与的点),那么所有度大于2的点都需要熔断,而且一次完成所有关于这个点的熔断 ...
- bzoj2503 相框——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 思路题: 首先,这种问题应该注意到答案只跟度数有关,跟其他什么连接方法之类的完全无关: ...
- bzoj 2151 种树 —— 思路+链表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施 ...
- 【BZOJ-2503】相框 并查集 + 分类讨论
2503: 相框 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 71 Solved: 31[Submit][Status][Discuss] Desc ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj [SDOI2014]数表 莫比乌斯反演 BIT
bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...
- [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]
题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...
随机推荐
- SF Symbols 使用
伴随着WWDC 2019 的举办,对于程序员而言 ,无疑SwiftUI 推出 是比较令人兴奋的一件事情, 其中在SwiftUI 使用之中, 我们经常使用以下系统图片 Image(systemName: ...
- Programming | 变量名的力量
命名准则 变量名要完全,准确的描述变量所代表的事物,一般而言,对变量的描述就是最佳的变量名.避免x,temp,i等泛泛而谈的变量名. 比如对于矩阵的循环,matrix[row][col]就比m[i][ ...
- Hadoop 2.x 版本中的依赖 jar
- keepalived的常见的健康检查方式
TCP_CHECK tcp端口检测 HTTP_GET http接口检测 MISC_CHECK 自定义脚本检测 tcp端口检测 TCP_CHECK { connect_port 80 connect_t ...
- JS数组 编程练习 使用Javascript语言,把以下数组 在页面显示如下图所示的图案
编程练习 使用Javascript语言,把以下数组 var arr = ['*','##',"***","&&","****&quo ...
- thinkphp 组合查询
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string).复合查询(_complex).请求字符串查询(_query),混合查询中的特殊查询每次查询只能定 ...
- 前端面试题之一JAVASCRIPT(算法类)
一.JS操作获取和设置cookie //创建cookie function setcookie(name, value, expires, path, domain, secure) { var co ...
- C++ const修饰不同类型的用法
const取自constant的缩写,本意是不变的,不易改变的意思 一.修饰普通变量 const int a = 7; int b = a; //正确 a = 8; ...
- linux操作mysql命令快速手记 — 让手指跟上思考的速度(二)
这一篇是<mysql内建命令快速手记>的姐妹篇,废话不再赘述,直接上干货,跟老铁慢慢品 1.mysql -hlocalhost -uroot -proot,-h,-u,-p分别代表ip,u ...
- Mysql 增加rownum
Mysql 增加rownum 实现(极度推荐) mysql本身不像oracle那样使用 rownum 来显示行号的功能.但是可以使用设置变量的方式来实现这一功能. mysql使用 @ 定义用户变量, ...