题意:给你一棵树,然后树上有m个坏人,每个坏人位于某一个结点上,坏人之间能够相互联系的条件是当且仅当两个坏人的距离大于1,每一小时坏人会相互联系一次,他们会随机的选择一个能联系的同伴方向移动,然后问你坏人之间不能相互联系的时间期望是多少。
题解:比赛时翻译完这道题我是懵逼的,但是感觉真的很奇怪,就觉得需要瞎搞搞,不然真的不知道怎么写,后来比赛完出题人说这是一个签到题,然而全场只过了5个队? 正解就是求树上的最远点对之间的距离/2。。。。。
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1005],d[1005];
vector<int>q[1005];
void dfs(int x,int p,int len)
{
for(int i=0;i<q[x].size();i++)
{
int v=q[x][i];
if(v==p)
continue;
d[v]=max(d[v],len+1);
dfs(v,x,len+1);
}
}
int main(void)
{
int T,n,m,x,y;
scanf("%d",&T);
while(T--)
{
memset(d,0,sizeof(d));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
q[x].push_back(y);
q[y].push_back(x);
}
for(int i=1;i<=m;i++)
dfs(a[i],0,0);
int ans=0;
for(int i=1;i<=m;i++)
ans=max(ans,d[a[i]]);
printf("%.2f\n",floor((double)ans/2));
for(int i=1;i<=n;i++)
q[i].clear();
}
return 0;
}