奇数度数 bzoj-2443 Usaco-2011 Open

题目大意:给定一个n个点m条边的无向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数。

注释:$1\le n \le 5\cdot 10^4$,$1\le m\le 10^5$。


想法

结论题:对于一个联通块来讲,如果求出它的生成树。只考虑生成树上的边的选取情况是否可能即是这个联通块的答案。

证明:如果存在一种,选取生成树以外的边满足题意,我们可以将这条边覆盖的树边全部取反,将该边舍去,仍然满足题意。

故此,用并查集求出生成树,然后在上面跑树形dp即可。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50010
#define M 100010
using namespace std;
int head[N],to[N<<1],nxt[N<<1],val[N<<1],cnt;
int is[M],tot,n,m,fa[N],f[N],vis[N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=nc(); while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
void add(int u,int v,int w) {to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;}
void dfs(int pos,int fa)
{
int now=0; vis[pos]=1;
for(int i=head[pos];i;i=nxt[i]) if(to[i]!=fa)
{
dfs(to[i],pos);
if(f[to[i]]) now++;
else is[val[i]]=1,tot--;
}
f[pos]=!(now&1);
}
int main()
{
n=rd(),m=rd(); tot=m;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int x=rd(),y=rd();
int dx=find(x),dy=find(y);
if(dx!=dy) add(x,y,i),add(y,x,i),fa[dx]=dy;
else is[i]=1,tot--;
}
for(int i=1;i<=n;i++) if(!vis[i])
{
dfs(i,0); if(f[i]) {puts("-1"); return 0;}
}
printf("%d\n",tot);
for(int i=1;i<=m;i++) if(!is[i]) printf("%d\n",i);
return 0;
}

小结:好题啊,真心好题。首先这个结论不是想Gem那样没法猜的结论,这个结论是可以证出来的。其次树形dp很常规啊!

最新文章

  1. 【POJ2104】K-th Number
  2. 写在OpenFire
  3. python初识第二篇
  4. LAMP安全设置
  5. 软件包管理 之 RPM 基础 《RPM 的介绍和应用》
  6. Sharepoint 2013列表视图和字段权限扩展插件(免费下载)!
  7. note: declarations in dependent base ‘std::basic_ios&lt;char&gt;’ are not found by unqualified lookup
  8. AlphaBlend參数BLENDFUNCTION
  9. ATL opengl
  10. Atitit.如何文章写好 论文 文章 如何写好论文 技术博客 v4
  11. C# ValueTuple 原理
  12. day 29 socketsetserver 模块
  13. svn下copy项目后定位到新资源库,产生不同版本号的方法
  14. verilog中defparam的用法 (verilog调用底层模块(只改变)参数的传递)
  15. cat集成项目所遇到的一些坑
  16. Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串
  17. java框架----&gt;commonmark的使用(一)
  18. 编写高效的JavaScript程序
  19. [转] Fragment——startActivityForResult后onActivityResult无反应之问题总结
  20. (ZT)谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版

热门文章

  1. Java 208道面试题及部分答案
  2. SpringBoot之旅第七篇-Docker
  3. VS2012出现加载失败时的解决办法 win7同样适用
  4. Hadoop YARN学习监控JVM和实时监控Ganglia、Ambari(5)
  5. 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
  6. sh NonUniqueObjectException
  7. springboot实现web应用过程中的摸爬打滚(持续更新ing)
  8. Linux C下变量和常量的存储的本质
  9. scikit-learn - 分类模型的评估 (classification_report)
  10. 使用Java(Jedis)链接redis报java.net.ConnectException: Connection refused: connect的错误