题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503

我也知道应该只关注度数。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=,M=;
  6. int n,m,deg[N],sum,ans;
  7. int main()
  8. {
  9. scanf("%d%d",&n,&m);int x,y;
  10. for(int i=;i<=m;i++)
  11. {
  12. scanf("%d%d",&x,&y);
  13. deg[x]++;deg[y]++;
  14. sum+=(!deg[x])+(!deg[y]);//焊接
  15. }
  16. for(int i=;i<=n;i++)
  17. {
  18. if(deg[i]>)ans+=deg[i]/-+(deg[i]&);//烧熔
  19. sum+=(deg[i]&);//焊接
  20. }
  21. printf("%d",ans+(sum>>));
  22. return ;
  23. }

秒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就好了!仔细想一想是等价的。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=,M=5e4+;
  6. int n,m,deg[N],fa[N],jd,ans,yf,cnt;
  7. bool tag[N],cz[N];
  8. int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
  9. int main()
  10. {
  11. scanf("%d%d",&n,&m);int x,y;
  12. for(int i=;i<=m;i++)
  13. {
  14. scanf("%d%d",&x,&y);
  15. if(!x)x=++n;if(!y)y=++n;//!!!
  16. deg[x]++;deg[y]++;fa[find(x)]=find(y);
  17. // if(!x&&!y)jd+=2;
  18. // else if(x&&y)deg[x]++,deg[y]++,fa[find(x)]=find(y);
  19. // else{
  20. // jd++;if(x)deg[x]++;if(y)deg[y]++;
  21. // }
  22. }
  23. for(int i=;i<=n;i++)
  24. {
  25. if(deg[i]&)jd++,tag[find(i)]=;
  26. if(deg[i]>)ans++,cz[find(i)]=;//记录cz!//一次就能熔好!!!!!
  27. if(deg[i]&&fa[i]==i)cnt++;//deg[i]!!
  28. }
  29. if(cnt==&&!jd){printf("0\n");return ;}
  30. for(int i=;i<=n;i++)
  31. if(fa[i]==i&&!tag[i]&&cnt>)
  32. {
  33. if(!cz[i])ans++;
  34. jd+=;//&&cnt>1!
  35. }
  36. printf("%d\n",ans+(jd>>));
  37. return ;
  38. }

秒WA

再次学习(抄)了一遍。

别忘了到处判断deg[ i ]!!!别忘了把数组调大,赋 fa[ ] 的时候也要调大范围!

虽然A了可是一点也不高兴怎么办……

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=,M=5e4+,Lm=1e5+1e3+;;
  6. int n,m,deg[Lm],fa[Lm],jd,ans,cnt;
  7. bool tag[Lm],cz[Lm];
  8. int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
  9. int main()
  10. {
  11. scanf("%d%d",&n,&m);int x,y;
  12. for(int i=;i<=Lm-;i++)fa[i]=i;
  13. for(int i=;i<=m;i++)
  14. {
  15. scanf("%d%d",&x,&y);
  16. if(!x)x=++n;if(!y)y=++n;//!!!
  17. deg[x]++;deg[y]++;fa[find(x)]=find(y);
  18. // if(!x&&!y)jd+=2;
  19. // else if(x&&y)deg[x]++,deg[y]++,fa[find(x)]=find(y);
  20. // else{
  21. // jd++;if(x)deg[x]++;if(y)deg[y]++;
  22. // }
  23. }
  24. for(int i=;i<=n;i++)
  25. {
  26. if(deg[i]&)jd++,tag[find(i)]=;
  27. if(deg[i]>)ans++,cz[find(i)]=;//记录cz!//一次就能熔好!!!!!
  28. if(deg[i]&&find(i)==i)cnt++;//deg[i]!!
  29. }
  30. // if(cnt==1&&!jd){printf("0\n");return 0;}
  31. for(int i=;i<=n;i++)
  32. if(deg[i]&&find(i)==i&&!tag[i]&&cnt>)//deg[i]!!!
  33. {
  34. if(!cz[i])ans++;
  35. jd+=;//&&cnt>1!
  36. }
  37. printf("%d\n",ans+(jd>>));
  38. return ;
  39. }

bzoj 2503 相框——思路的更多相关文章

  1. bzoj 2503 相框 分类讨论

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

  2. 【BZOJ 2503】相框 图论+讨论

    这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力. 我们先分析题干信息.我们要形成相框,那么所有的点的度为2(参与的点),那么所有度大于2的点都需要熔断,而且一次完成所有关于这个点的熔断 ...

  3. bzoj2503 相框——思路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2503 思路题: 首先,这种问题应该注意到答案只跟度数有关,跟其他什么连接方法之类的完全无关: ...

  4. bzoj 2151 种树 —— 思路+链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施 ...

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

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

  6. BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)

    BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...

  7. bzoj AC倒序

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

  8. bzoj [SDOI2014]数表 莫比乌斯反演 BIT

    bzoj [SDOI2014]数表 莫比乌斯反演 BIT 链接 bzoj luogu loj 思路 \[ \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}a*[f[ ...

  9. [HNOI2012][BZOJ2732] 射箭 [二分+半平面交]

    题面 BZOJ题面 思路 半平面交代码讲解戳这里,用的就是这道题 我们射箭的函数形如$y=Ax^2+Bx$ 考虑每一个靶子$(x_0,y_1,y_2)$,实际上是关于$A,B$的不等式限制条件 我们只 ...

随机推荐

  1. wdatapicker 时间选择器——例

    效果: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. Shuffle过程详解

  3. openSUSE安装Composer

    使用的是LAMP,PHP版本为7.0.7. 在终端中,运行以下命令 php -r "copy('https://install.phpcomposer.com/installer', 'co ...

  4. 在双重for循环内部使用async异步请求axios中遇到的问题

    在methods中的方法 async getPro () { let _this = this let newArr = [] await axios.get(`api/v1/dailyProTbms ...

  5. Java-MyBatis-MyBatis3-XML映射文件:结果映射

    ylbtech-Java-MyBatis-MyBatis3-XML映射文件:结果映射 1.返回顶部 1. 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90 ...

  6. iOS开发自定义转场动画

    1.转场动画 iOS7之后开发者可以自定义界面切换的转场动画,就是在模态弹出(present.dismiss),Navigation的(push.pop),TabBar的系统切换效果之外自定义切换动画 ...

  7. mongdb 使用聚合函数异常

    异常信息: Command execution failed:  Error [The 'cursor' option is required, except for aggregate with t ...

  8. 基于用户的最近邻协同过滤算法(MovieLens数据集)

      基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...

  9. vue @click传字符串

    参考: https://www.cnblogs.com/springlight/p/5782637.html 关键:使用转译字符 \ 来转译引号 方法一. 直接传递: var tem = " ...

  10. 从0开始学习ssh之资源分类

    更目录下面,新建config用于放配置文件,新建test用于放置测试文件.src目录用于放置源代码.由于ssh是三层,因此新建三层包(dao,service,view).其中dao和service还有 ...