HDOJ树形DP专题之Centroid
这题跟Balance Act那题差不多,求图的质点。我直接将那题改了一下提交,结果PE了一次,又WA了一次,最后发现是单case,多case的提交为什么WA呢?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 16000 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 vector<int> g[N]; 8 int n,p[N],d[N],sum[N],w[N],dmax,ans[N],cnt; 9 void dfs(int u,int fa) 10 { 11 int i,v; 12 d[u]=(fa==-1?0:d[fa]+1); 13 dmax=MAX(dmax,d[u]); 14 for(i=0; i<g[u].size(); i++) 15 { 16 v=g[u][i]; 17 if(v!=fa) dfs(v,p[v]=u); 18 } 19 } 20 void dp() 21 { 22 int i,j; 23 memset(w,0,sizeof(w)); 24 for(i=0; i<n; i++) sum[i]=1; 25 for(i=dmax; i>=0; i--) 26 { 27 for(j=0; j<n; j++) 28 { 29 if(d[j]!=i) continue; 30 w[j]=MAX(w[j],n-sum[j]); 31 if(i>0) w[p[j]]=MAX(w[p[j]],sum[j]),sum[p[j]]+=sum[j]; 32 } 33 } 34 } 35 int main() 36 { 37 int i,t,u,v,min; 38 scanf("%d",&n); 39 for(i=0; i<n; i++) g[i].clear(); 40 for(i=0; i<n-1; i++) 41 { 42 scanf("%d%d",&u,&v); 43 u--,v--; 44 g[u].push_back(v); 45 g[v].push_back(u); 46 } 47 dmax=0; 48 dfs(0,-1); 49 dp(); 50 min=0x7fffffff; 51 cnt=0; 52 for(i=0; i<n; i++) 53 { 54 if(w[i]<min) cnt=0,min=w[i],ans[cnt++]=i; 55 else if(w[i]==min) ans[cnt++]=i; 56 } 57 printf("%d %d\n",min,cnt); 58 for(i=0; i<cnt-1; i++) printf("%d ",ans[i]+1); 59 printf("%d",ans[cnt-1]+1); 60 return 0; 61 }