题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=784
题意:
给一棵树,某些点上有人,每个时刻每个人都会往一个距离大于1的人的方向前进1个,
问期望多久所有人都在距离1以内
思路:
树上最远两个人的距离/2就是答案(向下取整)
因为n只有1000,所以可以n²暴力
//2017CCPC哈尔滨--D
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> G[1005];
int ans, k[1005];
void Sech(int u, int p, int len)
{
int i, v;
if(k[u])
ans = max(ans, len);
for(i=0;i<G[u].size();i++)
{
v = G[u][i];
if(v==p)
continue;
Sech(v, u, len+1);
}
}
int main(void)
{
int T, n, m, x, y, i;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
G[i].clear();
memset(k, 0, sizeof(k));
for(i=1;i<=m;i++)
{
scanf("%d", &x);
k[x] = 1;
}
for(i=1;i<=n-1;i++)
{
scanf("%d%d", &x, &y);
G[x].push_back(y);
G[y].push_back(x);
}
ans = 0;;
for(i=1;i<=n;i++)
{
if(k[i])
Sech(i, 0, 0);
}
printf("%d.00\n", ans/2);
}
return 0;
}