(vijos 1892 noip 模拟 tree)<树形DP求树的最大匹配及方案数>
2017-08-13 19:24
471 查看
传送门
Solution
以后不补Code
输入和vijos1892不太一样// by spli #include<cstring> #include<cstdio> #include<algorithm> #include<iostream> #define LL long long using namespace std; const int N=1010; int n; struct node{ int to,nxt; }e[N<<1];int head ,cnt; bool vis ; LL ff ,gg ; LL f[2] ; LL g[2] ; void add(int f,int t){ cnt++; e[cnt]=(node){t,head[f]}; head[f]=cnt; } void dfs(int u,int fa){ g[0][u]=1; for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(v==fa) continue; dfs(v,u); f[0][u]+=ff[v]; g[0][u]*=gg[v]; } for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(v==fa) continue; LL t=f[0][u]-ff[v]+f[0][v]+1; LL p=g[0][u]/gg[v]*g[0][v]; if(f[1][u]==t) g[1][u]+=p; else if(t>f[1][u]){ f[1][u]=t;g[1][u]=p; } } if(f[1][u]>f[0][u]) ff[u]=f[1][u],gg[u]=g[1][u]; else if(f[0][u]>f[1][u]) ff[u]=f[0][u],gg[u]=g[0][u]; else ff[u]=f[1][u],gg[u]=g[0][u]+g[1][u]; } int main(){ memset(head,-1,sizeof(head)); scanf("%d",&n); int u,num,x; for(int i=1;i<=n;++i){ scanf("%d%d",&u,&num); if(!num) vis[i]=1; for(int j=1;j<=num;++j){ scanf("%d",&x); add(u,x); } } dfs(1,1); if(f[1][1]>f[0][1]) cout<<f[1][1]<<endl<<g[1][1]; else if(f[1][1]==f[0][1]) cout<<f[1][1]<<endl<<g[1][1]+g[0][1]; else cout<<f[0][1]<<endl<<g[0][1]; return 0; }
相关文章推荐
- [vijos1892]树上的最大匹配(树形DP)
- (noip 模拟 染色)<树形DP>
- 【vijos】1892 树上的最大匹配(树形dp+计数)
- CF260--C--dp<最大不连续子序列和>
- 树形DP <dfs+floyd> 【hlg】 1329 游乐园
- (POJ3020)Antenna Placement 单链的最大匹配<匈牙利算法,最大匹配>
- tarjan + DP_tree <战争游戏>
- (洛谷P2014 选课)<树形DP>
- hdu--1520--树形dp<写起来就是深搜啊>-<滚动数组优化>
- jzoj3501 【NOIP2013模拟联考15】消息传递(news) 树形dp
- LG1073【NOIp2009】最优贸易 <Tarjan+DP>
- Tsinsen A1320 Painting 【最大权匹配】【树形DP】
- VIJOS-P1011清帝之惑之顺治<滑雪> 【区间DP--相邻位】
- Struts2 <sx:tree>动态树形菜单
- (noip 模拟 flower 种花)<贪心+后悔>
- 最小点集覆盖=最大匹配<二分图>/证明
- 树形DP 或 最小顶点覆盖=最大匹配(双向图)(HDU 1053)
- hdu--4504--又是dp啊<方案决策数>
- (noip 模拟 gift)<丧病背包>
- 最大子矩阵问题<DP>