bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】
2018-07-22 22:22
453 查看
参考:https://www.geek-share.com/detail/2671431439.html 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样
首先分情况讨论,如果没有奇环,每条边都可以删;如果有一个奇环,奇环上隋边山;否则,删被所有奇环覆盖且没被任何一个偶环覆盖的边
那么重点就是怎样找到所有的奇环和偶环
用树形dp来搞,设f[i]记录经过第i条边的奇环数,g[i]记录经过第i条边的偶环数,因为是边的编号而存的是双向边,所以dp的时候用i>>1表示
然后随便dfs出一棵树,对于其他的返祖边如果是奇环的话f[i]++,偶环同理,并且加到父亲上
然后如果是返祖边的返祖边要减掉,因为已经统计过了
#include<iostream> #include<cstdio> using namespace std; const int N=2000005; int n,m,cnt=1,h ,con,ans ,f ,g ,p ,q ,top,tot; bool v ; struct qwe { int ne,to; }e ; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } void add(int u,int v) { cnt++; e[cnt].ne=h[u]; e[cnt].to=v; h[u]=cnt; } void dfs(int u,int fa) { v[u]=1; p[u]=++top; for(int i=h[u];i;i=e[i].ne) if(q[i]!=-1) { if(!v[e[i].to]) { q[i]=q[i^1]=-1; dfs(e[i].to,i>>1); f[fa]+=f[i>>1]; g[fa]+=g[i>>1]; } else { if(q[i]==1) f[fa]--; if(q[i]==2) g[fa]--; if(q[i]==0) { if((p[u]-p[e[i].to])&1) g[fa]++,q[i]=q[i^1]=2; else f[fa]++,q[i]=q[i^1]=1,con++; } } } top--; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int x=read(),y=read(); add(x,y),add(y,x); } for(int i=1;i<=n;i++) if(!v[i]) dfs(i,0); if(con==0) { tot=m; for(int i=1;i<=m;i++) ans[i]=i; } else { for(int i=1;i<=m;i++) if((f[i]==con&&g[i]==0)||(con==1&&q[i<<1]==1)) ans[++tot]=i; } printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("%d ",ans[i]); return 0; }
相关文章推荐
- [BZOJ4424]CodeForces 19# E Fairy(树形dp / Link-Cut-tree)
- bzoj 3302&2447&2103 树的双中心 树形DP
- BZOJ(本校) 3049 第K大 - 二分&树形dp
- bzoj3572 世界树 虚树&树形dp
- [第二类斯特林数 树形DP] HDU 4625 JZPTREE && BZOJ 2159 Crash 的文明世界
- bzoj1023 仙人掌图【仙人掌&&树形dp】
- BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
- 【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黄昏下的礼物 dp转有限状态自动机+矩阵乘法优化
- [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 & UOJ #185 【ZJOI2016】小星星
- bzoj2286 消耗战 虚树&树形dp
- vijos1144&&bzoj1596(树形dp,树上最小控制集
- bzoj 4424: Cf19E Fairy dfs
- bzoj 3162: 独钓寒江雪 树形dp&hash
- [BZOJ2878][Noi2012]迷失游乐园 && 树形DP
- BZOJ(本校) 3044 旅行 - 树形dp&基环树
- [BZOJ2427][HAOI2010]软件安装(Tarjan+树形&背包DP)
- [树形DP 启发式合并 神题] BZOJ 4543 [POI2014]Hotel加强版 & BZOJ 3522 [Poi2014]Hotel
- BZOJ-4424 &&CodeForces-19E Fairy DP+dfs (Link-Cut-Tree可A)
- BZOJ-4424 &&CodeForces-19E Fairy DP+dfs (Link-Cut-Tree可A)
- HYSBZ/BZOJ 1040 [ZJOI2008] 骑士 - 基环树&树形dp