博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1655 Balancing Act (树形dfs)
阅读量:6037 次
发布时间:2019-06-20

本文共 1120 字,大约阅读时间需要 3 分钟。

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

刚开始的答案值修改的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, 
0
sizeof(head)) ;
        
for(
int i=
1; i<n; i++){
            scanf(
"
%d%d
", &x, &y) ;
            addedge(x, y) ;
            addedge(y, x) ;
        }
        memset(vis, 
0
sizeof(vis)) ;
        memset(num, 
0
sizeof(num)) ;
        Min = MAX ;
        dfs(
1) ;
        printf(
"
%d %d\n
", anspoint, ansnum) ;
    }
    
return 
0 ;
}

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/02/29/2373486.html

你可能感兴趣的文章
hdu1116
查看>>
AD集成库元件简写中英文对照表
查看>>
六年程序生涯
查看>>
CrashHandler: java.lang.NullPointerException
查看>>
C#Ftp的下载实例
查看>>
HDU4335 What is N? [数论(欧拉函数)]
查看>>
会声会影字幕制作
查看>>
电商网站中添加商品到购物车功能模块2017.12.8
查看>>
由支付宝当面付引发的NatApp方便调试回调
查看>>
享受LINQ:判断一组文字是否在字符串中同时出现的最简单方法
查看>>
UVA1437 String painter
查看>>
poj 1671 Rhyme Schemes
查看>>
HDU 2639 Bone Collector II DP
查看>>
uni-app 通过本地经纬度获取详细地理位置
查看>>
扩展欧几里得学习小记
查看>>
Linux useradd 添加用户
查看>>
poj3427
查看>>
android 模拟器 hardWare 属性说明
查看>>
GM11灰色模型
查看>>
六款值得推荐的android(安卓)开源框架简介
查看>>