#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=55009;
int n,q,a,b,fa[N],vis[N],ans[N],v[N],Max[N],Min[N],up[N],down[N];
vector<int> need[N],edge[N],kv[N];
int find(int x)
{
if(x==fa[x])return x;
int y=fa[x];
fa[x]=find(fa[x]);
up[x]=max(Max[y]-Min[x],max(up[x],up[y]));
down[x]=max(Max[x]-Min[y],max(down[x],down[y]));
Max[x]=max(Max[y],Max[x]);
Min[x]=min(Min[y],Min[x]);
return fa[x];
}
void tarjan(int x)
{
vis[x]=1;
for(int i=0;i<need[x].size();i=i+2)
{
int y=need[x][i];
if(vis[y])
{
int t=find(y),f=need[x][i+1];
if(f>0)
{
kv[t].push_back(x);
kv[t].push_back(y);
}
else
{
kv[t].push_back(y);
kv[t].push_back(x);
}
kv[t].push_back(f>0?f:-f);
}
}
for(int i=0;i<edge[x].size();i++)
{
int y=edge[x][i];
if(!vis[y])
{
tarjan(y);
fa[y]=x;
}
}
for(int i=0;i<kv[x].size();i=i+3)
{
int a=kv[x][i],b=kv[x][i+1],f=kv[x][i+2];
find(a);find(b);
ans[f]=max(up[a],max(down[b],Max[b]-Min[a]));
}
}
void init()
{
for(int i=0;i<=n;i++)
{
fa[i]=i;
vis[i]=0;
need[i].clear();
edge[i].clear();
kv[i].clear();
}
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
Max[i]=v[i];
Min[i]=v[i];
up[i]=0;
down[i]=0;
}
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&a,&b);
edge[a].push_back(b);
edge[b].push_back(a);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
need[a].push_back(b);
need[a].push_back(i);
need[b].push_back(a);
need[b].push_back(-i);
}
tarjan(1);
for(int i=1;i<=q;i++)
{
printf("%d\n",ans[i]);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
}
}
分享到:
相关推荐
POJ2186-Popular Cows ...【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
poj2492 A Bug's Life并查集应用的扩展,希望可以给大家带来用处
2505 2521 2538 2546 2551 2590 2593 2601 2665 2680 2739 2752 2761 2762 2777 2800 2891 2893 2992 3030 3041 3132 3159 3187 3204 3270 3277 3281 3297 3321 3414 3436 3461 3650 3663 3664 3672 3740
POJ 1988 并查集。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
poj 食物链代码.带权并查集,关键是找到其中的一些关系式.
这份代码用C++实现了经典算法并查集,来源于poj题目1182
POJ2942-Knights of the ...【Tarjan算法】 解题报告+AC代码 http://hi.csdn.net/!s/F3L8HO ================================== 我的POJ所有解题报告:http://blog.csdn.net/lyy289065406/article/details/6642573
POJ1089 并查集可以解决 并查集加路径压缩
POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
并查集基础 acm 算法 poj oi 并查集基础.ppt
数据结构并查集的相关资料,包括几篇并查集的论文,还有POJ上面几道关于并查集的题目的源代码
poj 1611 The Suspects 代码 并查集的应用
poj 800+ 题目源代码,多年做题积累 包含各种类型经典题目
POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
很好很强大的POJ分类 新手+进阶+题目完全分类 赶快下载
对于LCA问题,有不少解法,这儿提供了tarjan算法,这是一种离线算法,读入所有输入然后一并处理,并且利用并查集的思想,从根节点开始DFS,对每一个DFS的节点,先把他的父亲节点指向本身,没访问完一个子节点,然后...
西北工业大学POJ试题C++答案代码+课程设计
北大POJ初级-简单搜索 解题报告+AC代码
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...