HDOJ树形DP专题之Centroid

题目链接

这题跟Balance Act那题差不多,求图的质点。我直接将那题改了一下提交,结果PE了一次,又WA了一次,最后发现是单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 }

 

你可能感兴趣的:(dp)