您的位置:首页 > 其它

POJ 1655 (树dp or 树重心)

2016-08-15 17:06 260 查看
【题意】不解释了。

【解题方法】其实这题就是一个树的重心,我用两种方法写的,水题。

【AC 代码 1】

//树的重心
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 20005;
const int inf = 0x3f3f3f3f;
int head[maxn],tot,mx,mxcnt,n,siz[maxn];
int minn,minid;
void init(){
memset(head,-1,sizeof(head));
tot=0;
}
struct edge{
int v,next;
}E[maxn*2];
void addedge(int u,int v){
E[tot].v=v,E[tot].next=head[u],head[u]=tot++;
}
void dfs(int u,int fa)
{
siz[u]=1;
int he=-1;
for(int i=head[u]; ~i; i=E[i].next){
int v=E[i].v;
if(v==fa) continue;
dfs(v,u);
siz[u]+=siz[v];
he=max(he,siz[v]);
}
he=max(he,n-siz[u]);
if(he<minn){
minn=he;
minid=u;
}else if(he==minn&&minid<u){
minid=u;
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int u,v;
init();
for(int i=1; i<n; i++){
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
minn=inf;
dfs(1,-1);
cout<<minid<<" "<<minn<<endl;
}
return 0;
}


【AC代码2】
//树形do
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 20010;
int head[maxn],tot,dp[maxn],siz[maxn],n;
struct edge{
int v,next;
}E[maxn*2];
void init(){
memset(head,-1,sizeof(head));
tot=0;
}
void addedge(int u,int v){
E[tot].v=v,E[tot].next=head[u],head[u]=tot++;
}
void dfs(int u,int fa){
siz[u]=1,dp[u]=0;
for(int i=head[u]; ~i; i=E[i].next){
int v=E[i].v;
if(v==fa) continue;
dfs(v,u);
dp[u]=max(dp[u],siz[v]);
siz[u]+=siz[v];
}
dp[u]=max(dp[u],n-siz[u]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
for(int i=1; i<n; i++){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
dfs(1,-1);
int ans1=1,ans2=dp[1];
for(int i=2; i<=n; i++){
if(dp[i]<ans2){
ans2=dp[i];
ans1=i;
}
}
cout<<ans1<<" "<<ans2<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: