HDOJ树形DP专题之Centroid
生活随笔
收集整理的這篇文章主要介紹了
HDOJ树形DP专题之Centroid
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接
這題跟Balance Act那題差不多,求圖的質(zhì)點。我直接將那題改了一下提交,結(jié)果PE了一次,又WA了一次,最后發(fā)現(xiàn)是單case,多case的提交為什么WA呢?
View Code
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 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/algorithms/archive/2012/05/02/2479673.html
總結(jié)
以上是生活随笔為你收集整理的HDOJ树形DP专题之Centroid的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单调栈讲解
- 下一篇: python实现网关_用python实现