poj3107 树的重心 非stl实现

28 篇文章 0 订阅
25 篇文章 0 订阅

poj3107

求树的重心,全部输出

(poj1655 输出序号最小的节点,数据规模小一点,使用stl)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int N;
int v[50010*2],next[50010*2],head[50010],E;
int vis[50010];
int num[50010],dp[50010];

void add(int a,int b){		//b为a的子节点 
	
	v[E]=b;
	next[E]=head[a];
	head[a]=E++;
	
}

void dfs_num(int n,int from){
	num[n]=1;
	for(int i=head[n];i!=-1;i=next[i]){
		int k=v[i];			//儿子 
		if(k==from)	continue;
		dfs_num(k,n);
		num[n]+=num[k];
	}
}

void dfs_node(int n,int from){
	dp[n]=0;
	for(int i=head[n];i!=-1;i=next[i]){
		int	k=v[i];
		if(k==from)	dp[n]=max(dp[n],N-num[n]);
		else{
			dp[n]=max(dp[n],num[k]);
			dfs_node(k,n);
		}
	}
}

int main()
{
	int i,j,k,T,u,v;
	while(scanf("%d",&N)!=EOF)
	{
		E=0;
		memset(head,-1,sizeof(head));
		
		for(i=1;i<=N-1;i++)	{
			scanf("%d%d",&u,&v);
			add(u,v);
			add(v,u);
		}
		dfs_num(1,-1);
		dfs_node(1,-1);
		for(i=k=N;i>=1;i--)	if(k>dp[i])	k=dp[i];
		for(i=1;i<=N;i++)	if(dp[i]==k){
			printf("%d",i);
			break;
		}
		for(i=i+1;i<=N;i++){
			if(dp[i]==k)
			printf(" %d",i);
		}printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值