xdoj-1319 求树上任意一点的最大距离----利用树的直径

 1 #include <bits/stdc++.h>
using namespace std;
const int N=1e5+;
vector < vector <int> > g(N);
int d1[N],d2[N],d[N];
bool visit[N];
struct node {
int id;
int w;
};
queue <node> q;
int n,m;
void dfs (int rt) {
memset (visit,,sizeof(visit));
while (!q.empty()) q.pop();
node tmp={rt,};
q.push(tmp); visit[tmp.id]=; d[rt]=;
while (!q.empty()) {
tmp=q.front(); q.pop();
for (int i=;i<g[tmp.id].size();i++) {
int _next=g[tmp.id][i];
if (!visit[_next]) {
node k={_next,tmp.w+};
q.push(k); visit[k.id]=; d[_next]=k.w;
}
}
}
return ;
}
int find_max () {
int ans=; int k;
for (int i=;i<=n;i++)
if (d[i]>ans) {
ans=d[i];
k=i;
}
return k;
}
void my_copy (int *a,int *b) {
for (int i=;i<=n;i++)
a[i]=b[i];
}
int main ()
{
int T; scanf ("%d",&T);
while (T--) {
scanf ("%d",&n);
for (int i=;i<=n;i++) g[i].clear();
for (int i=;i<=n-;i++) {
int u,v; scanf ("%d %d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
int x1,x2;
dfs (); x1=find_max();
dfs (x1); x2=find_max();
my_copy (d1,d);
dfs (x2);
my_copy (d2,d);
scanf ("%d",&m);
while (m--) {
int k,p; scanf ("%d %d",&k,&p);
int len=max (d1[k],d2[k]);
if (p<=len) printf("%d\n",p+);
else printf("%d\n",min (n,len+(p-len)/+) );
}
}
return ;
}

感谢金牌果善意的提醒~~~树形dp还是有点麻烦。。

上一篇:有关Linux的.a、.so和.o文件(转)【原文章有些错误,自己已更改】


下一篇:Necklace (全排列 + 匈牙利)