首页 > 其他 > 详细

CodeForces 209C Trails and Glades[构造]

时间:2019-03-02 23:27:07      阅读:168      评论:0      收藏:0      [点我收藏+]

欧拉回路是经过所有仅一次

无向图有欧拉回路的条件是:每个点的度数都是偶数 并且图连通(可以有孤立点)


#include <cstdio>
#define N 1000007
int f[N],I[N],d[N],n,m,u,v,A;
int F(int x) {return x==f[x]?x:f[x]=F(f[x]);}
int main() {
  d[1]=2;//孤立点不需要连边 但一定要经过1号点 这样做是区别1和孤立点
  //答案是奇度点个数+不含奇度点的连通块个数
  //每个连通块一定有偶数个奇度点,直接连到1上就可以保证图连通,不含奇度点的连通块
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;++i)f[i]=i;
  while (m--)scanf("%d%d",&u,&v),++d[u],++d[v],f[F(u)]=F(v);
  for (int i=1;i<=n;++i)if(d[i]&1)I[F(i)]=1,++A;//I[i]表示i所在的连通块是否有奇度点
  for (int i=1;i<=n;++i)if(f[i]==i&&d[i]&&!I[i])++++A;//每个没有奇度点的连通块额外需要一条边 
  /*
  4
  1 2
  2 1
  3 4
  4 3 
  为了便于计算 可以理解为(1,2)和(3,4)各需要一条边
  */
  printf("%d",!I[F(1)]&&2==A?0:A/2);//如果1所在连通块没有奇度点并且没有其他边(A==2就是只有1所在连通块"需要"的那条边) 那么答案是0
  return 0;
}

CodeForces 209C Trails and Glades[构造]

原文:https://www.cnblogs.com/storz/p/10463442.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!