poj 1655 Balancing Act 寻找树的重心

来源:互联网 发布:centos安装nodejs 编辑:程序博客网 时间:2024/06/01 09:16

就是寻找树的重心的果题。

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

#include <map>#include <set>#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 20005;const int MAXE = 40005;int N;struct Edge {    int to;    Edge * next;}*EE,E[MAXE];struct Gragh{    Edge * first;}G[MAXN];int tot;int siz[MAXN];//有多少个子节点int num[MAXN];//子树中最大的int root;void init() {    EE = E;    memset(E,0,sizeof(E));    memset(G,0,sizeof(G));    num[root=0] = N;}void addedge(int u,int v) {    EE->to = v; EE->next = G[u].first; G[u].first = EE++;    EE->to = u; EE->next = G[v].first; G[v].first = EE++;}void dfs(int u,int fa = 0) {    siz[u] = 1;    num[u] = 0;    for(Edge * p = G[u].first ; p ; p = p -> next) {        if(p->to != fa) {            dfs(p->to,u);            siz[u] += siz[p->to];            num[u] = max(num[u],siz[p->to]);        }    }    num[u] = max(N-siz[u],num[u]);    if(num[u] < num[root]) root = u;}void input() {    scanf("%d",&N);    init();    int u,v;    for(int i = 1 ; i <= N - 1 ; i++) {        scanf("%d %d",&u,&v);        addedge(u,v);    }}void solve() {    dfs(1);    printf("%d %d\n",root,num[root]);}int main(void) {    //freopen("a.in","r",stdin);    int T;    scanf("%d",&T);    while(T--) {        input();        solve();    }    return 0;}
0 0
原创粉丝点击