poj1655 树的重心

http://poj.org/problem?id=1655

区分重心和直径。直径是树上最远距离两点,重心是一个点删除后最大树最小。

一个点删除后的最大树显然不是它的子树就是它的“上面”,“上面”是dp不了的,但是可以求补集

犯了一个习惯性For(i,1,N)的错误,但是边只有N-1条

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<stack>
#include<queue>
#include<set>
#include<sstream>
#include<map>
#include<ctime>
using namespace std;
#define For(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,k,n) for(int i=n;i>=k;i--)
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define NEG(a) memset(a,-1,sizeof(a));
#define FILL(a) memset(a,0x3f,sizeof(a));
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define print(b,a) cout<<b<<"="<<a<<endl;
#define printbin(b,a){int tmp=a;string s;do{s+=tmp%2+'0';tmp/=2;}while(tmp);reverse(s.begin(),s.end());cout<<"bin "<<b<<"="<<s<<endl;}
#define printarr(i,a,f,b) {For(i,f,b) printf("%d ",a[i]); printf("\n");}
#define fp   freopen("in.txt","r",stdin)
#define mod 1000000007

#define maxn (20000+100)

int t,N,ans,size;
int vis[maxn],son[maxn];
vector<int>e[maxn];

void dfs(int s)
{
    vis[s]=1;
    son[s]=1;
    int sz=e[s].size(),balance=-1;
    For(i,0,sz-1)
    {
        int u=e[s][i];
        if(vis[u]) continue;

        dfs(u);
        son[s]+=son[u];
        balance=max(balance,son[u]);
    }
    balance=max(balance,N-son[s]);
    if(balance<size||(balance==size&&s<ans))
    {
        ans=s;
        size=balance;
    }
}

int main()
{
    fp;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&N);

        int u,v;
        For(i,0,maxn-1)
        {
            e[i].clear();
        }
        For(i,1,N-1)
        {
            scanf("%d %d",&u,&v);
            e[u].push_back(v);
            e[v].push_back(u);
        }

        MEM(vis);
        MEM(son);
        size=INF;
        ans=-1;
        dfs(1);
        printf("%d %d\n",ans,size);
    }
    return 0;
}
View Code

 

posted @ 2016-08-03 13:57  aidgn  阅读(117)  评论(0编辑  收藏  举报