BZOJ4042 : [Cerc2014] parades

來源:互聯網
上載者:User

標籤:

設f[x]為x子樹裡能選的最多的路徑數,h[x]為x子樹裡往上走的點的集合,且不與x子樹內的最優解衝突

首先f[x]=sum(f[son])

若h[son]與x可以直接匹配,則匹配上,f[x]++

然後把剩下的未配對的son之間進行匹配,f[x]+=最大匹配數

因為度數不超過10,所以設dp[S]表示二進位表示為S的集合裡的最大匹配,x=lowbit(S),則

dp[S]=max(dp[S^(1<<x)],dp[S^(1<<x)^(1<<y)]+1),其中y屬於S,y>x,且x與y可以匹配

若dp[(1<<t)-1]==dp[((1<<t)-1)^(1<<i)],則表明i不在最優解中,需要將其加入h[x]中

時間複雜度$O(n2^{10})$。

 

#include<cstdio>const int N=1010,K=10;int T,n,m,i,x,y,f[N],q[K],t,a[K][K],dp[1<<K];bool e[N][N];struct E{int v;E*nxt;}*g[N],*h[N],pool[1010000],*cur=pool;inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}inline void addg(int x,int y){E*p=cur++;p->v=y;p->nxt=g[x];g[x]=p;}inline void addh(int x,int y){E*p=cur++;p->v=y;p->nxt=h[x];h[x]=p;}inline bool match(int x,int y){  for(E*i=h[x];i;i=i->nxt)for(E*j=h[y];j;j=j->nxt)if(e[i->v][j->v])return 1;  return 0;}inline void up(int&a,int b){if(a<b)a=b;}void dfs(int x,int y){  f[x]=0,h[x]=NULL;  for(E*i=g[x];i;i=i->nxt)if(i->v!=y)dfs(i->v,x),f[x]+=f[i->v];  t=0;  for(E*i=g[x];i;i=i->nxt)if(i->v!=y){    bool flag=1;    for(E*j=h[i->v];j;j=j->nxt)if(e[x][j->v]){f[x]++,flag=0;break;}    if(flag)q[t++]=i->v;  }  for(int i=0;i<t;i++)for(int j=i+1;j<t;j++)a[i][j]=match(q[i],q[j]);  int F=(1<<t)-1;  for(int S=1;S<=F;S++){    int i=__builtin_ctz(S&-S);    dp[S]=dp[S^(1<<i)];    for(int U=S-(S&-S);U;U-=U&-U){      int j=__builtin_ctz(U&-U);      if(a[i][j])up(dp[S],dp[S^(1<<i)^(1<<j)]+1);    }  }  f[x]+=dp[F],addh(x,x);  for(int i=0;i<t;i++)if(dp[F]==dp[F^(1<<i)])for(E*j=h[q[i]];j;j=j->nxt)addh(x,j->v);}int main(){  for(read(T);T--;printf("%d\n",f[1])){    for(read(n),i=1;i<n;i++)read(x),read(y),addg(x,y),addg(y,x);    for(read(m);m--;e[x][y]=e[y][x]=1)read(x),read(y);    dfs(1,0);    for(cur=pool,i=1;i<=n;i++)for(g[i]=NULL,x=1;x<=n;x++)e[i][x]=0;  }  return 0;}

  

BZOJ4042 : [Cerc2014] parades

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.