树的直径。。。。
1 4 2 3 2 1 2 4 2 2 4
1 4
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=150100;
struct Edge
{
int to,next;
}edge[maxn*2];
int n,Q,Adj[maxn],Size;
int dist[maxn];
bool vis[maxn];
void init()
{
Size=0; memset(Adj,-1,sizeof(Adj));
}
void Add_Edge(int u,int v)
{
edge[Size].to=v;
edge[Size].next=Adj[u];
Adj[u]=Size++;
}
int get_diameter()
{
queue<int> q;
memset(vis,0,sizeof(vis));
memset(dist,0,sizeof(dist));
q.push(1); vis[1]=true;
while(!q.empty())
{
int v,u=q.front(); q.pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
v=edge[i].to;
if(vis[v]) continue;
vis[v]=1;dist[v]=dist[u]+1;
q.push(v);
}
}
int goal=-1,mark=-1;
for(int i=1;i<=n;i++)
{
if(dist[i]>mark)
{
mark=dist[i];
goal=i;
}
}
memset(vis,0,sizeof(vis));
memset(dist,0,sizeof(dist));
q.push(goal); vis[goal]=true;
while(!q.empty())
{
int v,u=q.front(); q.pop();
for(int i=Adj[u];~i;i=edge[i].next)
{
v=edge[i].to;
if(vis[v]) continue;
vis[v]=1; dist[v]=dist[u]+1;
q.push(v);
}
}
goal=-1;
for(int i=1;i<=n;i++) goal=max(goal,dist[i]);
return goal;
}
int main()
{
int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d%d",&n,&Q);
init();
for(int i=0;i<n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
Add_Edge(u,v);
Add_Edge(v,u);
}
int dia=get_diameter();
while(Q--)
{
int x;
scanf("%d",&x);
x--;
if(x<=dia) printf("%d\n",x);
else printf("%d\n",dia+(x-dia)*2);
}
}
return 0;
}
HDOJ 4607 Park Visit,布布扣,bubuko.com
原文:http://blog.csdn.net/u012797220/article/details/22426179