• poj 1655 Balancing Act (树形dfs)


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

    poj3107,只要求输出一个数值最小的点。

    刚开始的答案值修改的num[]记录的,罪过罪过。。。 

    code:

    #include<cstdio>
    #include<cstring>
    #define Max(a, b)   a>b?a:b
    using namespace std ;
    const int MAX = 20001 ;
    int k, n, Min, anspoint, ansnum ;
    int vis[MAX], head[MAX], num[MAX] ;
    struct Edge{
        int v, next ;
    }edge[2*MAX] ;
    void addedge(int a, int b){
        edge[k].v = b ;
        edge[k].next = head[a] ;
        head[a] = k ++ ;
    }
    void dfs(int x){
        int i, v, min = -1 ;
        num[x] = 1 ;
        vis[x] = 1 ;
        for(i=head[x]; i; i=edge[i].next){
            v = edge[i].v ;
            if(vis[v]) continue ;
            dfs(v) ;
            num[x] += num[v] ;
            min = Max(min, num[v]) ;
        }
        min = Max(min, n-num[x]) ;
        if(min<Min){
            anspoint = x ;
            Min = min ;
            ansnum = min ;
        }else if(min==Min&&anspoint>x){
            anspoint = x ;
            ansnum = min ;
        }
    }
    int main(){
        int t, x, y ;
        scanf("%d", &t) ;
        while(t--){
            scanf("%d", &n) ;
            k = 1 ;
            memset(head, 0sizeof(head)) ;
            for(int i=1; i<n; i++){
                scanf("%d%d", &x, &y) ;
                addedge(x, y) ;
                addedge(y, x) ;
            }
            memset(vis, 0sizeof(vis)) ;
            memset(num, 0sizeof(num)) ;
            Min = MAX ;
            dfs(1) ;
            printf("%d %d\n", anspoint, ansnum) ;
        }
        return 0 ;
    }

  • 相关阅读:
    hdu1754 I Hate It
    51nod 1174 1174 区间中最大的数
    51nod1305 Pairwise Sum and Divide
    51nod 1622 集合对[算法马拉松19 C]
    51nod1265 四点共面
    51nod 1244 莫比乌斯函数之和
    51nod 1240 莫比乌斯函数
    51nod 1113 矩阵快速幂
    51nod 1264 线段相交(几何)
    51nod 1412 AVL树的种类(dp)
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2373486.html
Copyright © 2020-2023  润新知