[bzoj4390] [Usaco2015 dec]Max Flow
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj4390] [Usaco2015 dec]Max Flow相关的知识,希望对你有一定的参考价值。
给点打个标记,表示从根到这个点的路径上经过的点都+1
最后算一下子树内标记的个数。。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int maxn=100233; 6 struct zs{int too,pre;}e[maxn<<1];int tot,last[maxn]; 7 int add[maxn],bel[maxn],fa[maxn],sz[maxn],dep[maxn]; 8 int i,j,k,n,m,ans; 9 10 11 int ra;char rx; 12 inline int read(){ 13 rx=getchar(),ra=0; 14 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 15 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 16 } 17 void dfs(int x){ 18 dep[x]=dep[fa[x]]+1,sz[x]=1; 19 for(int i=last[x];i;i=e[i].pre)if(e[i].too!=fa[x]) 20 fa[e[i].too]=x,dfs(e[i].too),sz[x]+=sz[e[i].too]; 21 } 22 void dfs2(int x,int chain){ 23 bel[x]=chain; 24 int i,mx=0; 25 for(i=last[x];i;i=e[i].pre)if(e[i].too!=fa[x]&&sz[e[i].too]>sz[mx])mx=e[i].too; 26 if(!mx)return; 27 dfs2(mx,chain); 28 for(i=last[x];i;i=e[i].pre)if(e[i].too!=fa[x]&&e[i].too!=mx)dfs2(e[i].too,e[i].too); 29 } 30 inline int getlca(int a,int b){ 31 while(bel[a]!=bel[b]){ 32 if(dep[bel[a]]<dep[bel[b]])swap(a,b); 33 a=fa[bel[a]]; 34 } 35 return dep[a]<dep[b]?a:b; 36 } 37 void dfs3(int x){ 38 int sm=add[x]; 39 for(int i=last[x];i;i=e[i].pre)if(e[i].too!=fa[x])dfs3(e[i].too),sm+=add[e[i].too]; 40 if(sm>ans)ans=sm; 41 add[x]=sm; 42 } 43 inline void insert(int a,int b){ 44 e[++tot].too=b,e[tot].pre=last[a],last[a]=tot, 45 e[++tot].too=a,e[tot].pre=last[b],last[b]=tot; 46 } 47 48 int main(){ 49 n=read(),m=read(); 50 for(i=1;i<n;i++)insert(read(),read()); 51 dfs(1),dfs2(1,1); 52 int lca,a,b; 53 while(m--) 54 a=read(),b=read(),lca=getlca(a,b), 55 add[a]++,add[b]++,add[lca]--,add[fa[lca]]--; 56 dfs3(1); 57 printf("%d\\n",ans); 58 } 59
以上是关于[bzoj4390] [Usaco2015 dec]Max Flow的主要内容,如果未能解决你的问题,请参考以下文章
[bzoj4390] [Usaco2015 dec]Max Flow
bzoj4390: [Usaco2015 dec]Max Flow(LCA+树上差分)
USACO 2015 December Contest Max Flow (bzoj4390)
bzoj4397[Usaco2015 dec]Breed Counting*