Problem D

Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 249   Accepted Submission(s) : 32

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

WKC有一个收集灯泡的习惯,他把灯泡的阴极都共地,阳极连成一颗树,这样的话,他只要在任意一个灯泡的阳极加上合适的电压,所有灯泡都能亮起来。不幸的是,有一对灯泡之间的阳极连线断掉了,这样的话,这颗灯泡树就还有一部分能亮,一部分不能亮了。WKC想知道如果他在任意一个灯泡的阳极上加电压,这一对灯泡的哪一个会亮?

Input

首先是一个正整数T(1<=T<=10)表示测试数据的组数。

对于每一组测试数据:

第一行是一个整数n,q(3<=n,q<=100000),n表示灯泡总数,q表示查询个数。

接下来的n-1行,每行2个整数x,y(1<=x,y<=n),表示灯泡x和灯泡y的阳极相连。(数据保证合法,是一棵树)

接下来的q行,每行3个整数,a,b,c(1<=a,b,c<=n,数据保证合法,灯泡a和灯泡b之间有边且a不等于b)表示灯泡a和灯泡b之间阳极连线断开的话,在c的阳极加一个电压。

Output

每个查询之间相互独立,对于每个查询输出a和b哪一个会亮,输出a或者b即可。

Sample Input

1
3 1
1 2
2 3
1 2 3

Sample Output

2

算出 a到c距离,b到c距离 ,算距离用LCA

LCA可以考虑离线的Tarjan算法

Tarjan算法介绍参考这个

http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html

1.注意反向边可以通过 s^1 得到

2.少用#define maxn 1000+5 具体看置顶

代码如下“:

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
#define maxn 100010
using namespace std;
int n,q;
struct Edge{int to,ans,next;
void GET(int a,int b,int c){to=a,ans=b,next=c;}
};
struct Node{int first,deep;};
Edge E[maxn*6],EE[maxn*6];
Node Tree[maxn],Q[maxn];
int _E=0,_EE=0;
int a[maxn],b[maxn],c[maxn],visit[maxn],father[maxn];
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
void CLEAR()
{
for(int i=1;i<=n;i++)
{
Tree[i].first=-1;
Q[i].first=-1;
}
memset(visit,0,sizeof(visit));
_E=0;_EE=0;
for(int i=1;i<=100001;i++)
father[i]=i;
}
void Link(int u,int v)
{
E[_E].GET(v,0,Tree[u].first);Tree[u].first=_E++;
E[_E].GET(u,0,Tree[v].first);Tree[v].first=_E++;
}
void Link2(int u,int v)
{
EE[_EE].GET(v,0,Q[u].first);Q[u].first=_EE++;
EE[_EE].GET(u,0,Q[v].first);Q[v].first=_EE++;
}
int find(int x)
{
int r=x;
while(father[r]!=r)
{
r=father[r];
}
int i=x;
while(i!=r)
{
int j=father[i];
father[i]=r;
i=j;
}
return father[x];
}
void input()
{
int x,y;
cin>>n>>q;
CLEAR();
for(int i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
Link(x,y);
}
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
Link2(a[i],c[i]);
Link2(b[i],c[i]);
}
}
void Tarjan(int u,int deep)
{
visit[u]=1;
Tree[u].deep=deep;
for(int p=Q[u].first;p!=-1;p=EE[p].next)
if(visit[EE[p].to]==1)
EE[p^1].ans=EE[p].ans=find(EE[p].to); int t=0;
for(int p=Tree[u].first;p!=-1;p=E[p].next)
{
if(visit[E[p].to]==0)
{
Tarjan(E[p].to,deep+1);
father[E[p].to]=u;
}
}
}
void solve()
{
Tarjan(1,1);
int AA=0,BB=0,A=0,B=0;;
for(int i=1;i<=q;i++)
{
for(int p=Q[c[i]].first;p!=-1;p=EE[p].next)
{
if(EE[p].to==a[i]) A=EE[p].ans;
if(EE[p].to==b[i]) B=EE[p].ans;
}
AA=Tree[a[i]].deep+Tree[c[i]].deep-2*Tree[A].deep;
BB=Tree[b[i]].deep+Tree[c[i]].deep-2*Tree[B].deep;
if(AA<BB) printf("%d\n",a[i]);
else printf("%d\n",b[i]);
}
}
int main()
{
// init();
int T;
cin>>T;
while(T--)
{
input();
solve();
}
}

【Tarjan,LCA】【3-21个人赛】【problemD】的更多相关文章

  1. Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊

    [洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...

  2. poj 3417 Network(tarjan lca)

    poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...

  3. 洛谷 P2783 有机化学之神偶尔会做作弊(Tarjan,LCA)

    题目背景 LS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. “第1354题怎么做”<--手语 他问道 ...

  4. hdu 5286 How far away ? tarjan/lca

    How far away ? Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  5. POJ 3694 Network (tarjan + LCA)

    题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...

  6. poj3694Network(tarjan+lca)

    http://poj.org/problem?id=3694 用tarjan算出桥,用lca算出公共祖先 把路上的边更新掉 原来的桥变为不是桥 看一解题报告感觉有一部分是不用加的 不知道是不是数据水 ...

  7. Tarjan LCA

    强连通 迷宫城堡 Proving Equivalences Equivalent Sets Summer Holiday Intelligence System The King's Problem ...

  8. 【洛谷2416】泡芙(Tarjan+LCA)

    题目描述 火星猫经过一番努力终于到达了冥王星.他发现冥王星有 \(N\) 座城市,\(M\) 条无向边.火星猫准备出发去找冥王兔,他听说有若干泡芙掉落在一些边上,他准备采集一些去送给冥王兔.但是火星猫 ...

  9. Tarjan & LCA 套题题目题解

    刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...

随机推荐

  1. 监控父元素里面子元素内容变化 DOMSubtreeModified

    1监控ul的li的变化情况,并实时输出li的长度 布局: <ul id="isSelected"></ul> <span id="modal ...

  2. Nginx日志文件配置与切割

    Nginx日志的指令主要有两条: log_format,设置日志的格式 access_log,指定日志文件的存放路径.格式和缓存大小 两条指令在Nginx配置文件中的位置可以在http{……..}之间 ...

  3. Python的字符串与数字

    Python3.0通过“input”实现读取控制台的输入与用户实现交互.值得注意的是input接受的所有数据都是字符串,即使输入的是数字,依然会被当作字符串来处理.这就会出现一些问题,所以需要进行类型 ...

  4. [Android] 停止、恢复 背影音乐的播放

    在执行录音操作时,我们希望可以将酷狗等后台播放的音乐停掉,在录音完成后再恢复播放,可以使用以下代码: /**@param bMute 值为true时为关闭背景音乐.*/ @TargetApi(Buil ...

  5. iOS安全攻防(二十三):Objective-C代码混淆

    iOS安全攻防(二十三):Objective-C代码混淆 class-dump能够非常方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完好的程序给同行留下笑柄. 所以 ...

  6. Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间

    1.问:知道程序执行时间我们能够做什么? 在<C++应用程序性能优化>一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受. 那么我们怎 ...

  7. Visual Studio® 2010 Web Deployment Projects站点编译生成bin同时发表插件

    VS2010环境下: 1.Visual Studio® 2010 Web Deployment Projects下载地址:        http://www.microsoft.com/downlo ...

  8. ubuntu 14.04 chromium 设备adobe flash player(亲测可行)

    首先,根据浏览器提示下载Adobe Flash Player 插入 install_flash_player_11_linux.x86_64.tar.gz;然后使用sudo tar -xzvf ins ...

  9. LR实战之Discuz开源论坛——网页细分图结果分析(Web Page Diagnostics)

    续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场景(Controller),现在,终于到了LoadRunner性能测试结果分析(An ...

  10. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter

    java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast ...