简单的tarjan

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> #define N 10010
#define M 20010
#define C 2001000
using namespace std; struct edge{
int v,c;
int next;
}City[M]; struct query{
int v,index;
int next;
}Query[C];
int ctot,qtot;
int chead[N],qhead[N];
int fa[N];
int Value[N];
int ans[C/2];
int rts[N]; void addcedge(int u,int v,int c){
City[ctot].v=v;
City[ctot].c=c;
City[ctot].next=chead[u];
chead[u]=ctot++;
} void addqedge(int u,int v,int c){
Query[qtot].v=v;
Query[qtot].index=c;
Query[qtot].next=qhead[u];
qhead[u]=qtot++;
} int find(int u){
int p=u;
while(p!=fa[p])
p=fa[p];
while(u!=p){
int r=fa[u];
fa[u]=p;
u=r;
}
return p;
} void Union(int u,int v){
int uf=find(u);
int uv=find(v);
fa[v]=uf;
} void tarjan(int now,int pre,int val,int root){
rts[now]=root;
fa[now]=now;
Value[now]=val;
for(int e=chead[now];e!=-1;e=City[e].next){
int v=City[e].v;
if(v==pre) continue;
tarjan(v,now,val+City[e].c,root);
Union(now,v);
}
for(int e=qhead[now];e!=-1;e=Query[e].next){
int v=Query[e].v;
if(ans[Query[e].index]==-1&&rts[v]==root){
int vf=find(v);
ans[Query[e].index]=Value[v]+Value[now]-2*Value[vf];
}
}
} int main(){
int n,m,c,g; int u,v,q;
while(scanf("%d%d%d",&n,&m,&c)!=EOF){
memset(chead,-1,sizeof(chead));
memset(qhead,-1,sizeof(qhead));
memset(fa,-1,sizeof(fa));
memset(Value,0,sizeof(Value));
memset(ans,-1,sizeof(ans));
memset(rts,0,sizeof(rts));
ctot=qtot=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&g);
addcedge(u,v,g);
addcedge(v,u,g);
}
for(int i=1;i<=c;i++){
scanf("%d%d",&u,&v);
addqedge(u,v,i);
addqedge(v,u,i);
}
for(int i=1;i<=n;i++){
if(fa[i]==-1)
tarjan(i,-1,0,i);
}
for(int i=1;i<=c;i++){
if(ans[i]!=-1)
printf("%d\n",ans[i]);
else puts("Not connected");
}
}
return 0;
}

  

HDU 2874的更多相关文章

  1. HDU 2874 Connections between cities (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...

  2. HDU 2874 Connections between cities(LCA离线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...

  3. HDU 2874 Connections between cities(LCA(离线、在线)求树上距离+森林)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目大意:给出n个点,m条边,q个询问,每次询问(u,v)的最短距离,若(u,v)不连通即不在同 ...

  4. HDU 2874 Connections between cities(LCA+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2874 [题目大意] 有n个村庄,m条路,不存在环,有q个询问,问两个村庄是否可达, 如果可达则输出 ...

  5. hdu 2874(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 思路:近乎纯裸的LCA,只是题目给出的是森林,就要判断是否都在同一颗树上,这里我们只需判断两个子 ...

  6. 【HDU 2874】Connections between cities(LCA)

    dfs找出所有节点所在树及到树根的距离及深度及父亲. i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2. #include <cstring> #in ...

  7. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. Hdu 2874 Connections between cities

    题意: 城市 道路  没有环 不一定连通的树 求两城市的最短距离 设想一下就是很多小树  那好办 思路: lca离线算法 然后有个技巧就是 每次我们tarjan一棵树不是最后树的节点都访问过并且孩子全 ...

  9. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  10. hdu 2874(裸LCA)

    传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...

随机推荐

  1. 【转】坑爹的AsyncTask之根本停不下来

    原文网址:http://www.jianshu.com/p/0c6f4b6ed558 上篇<坑爹的AsyncTask之内存泄露>已经简单的探讨过线程使用不当会造成内存泄露的问题,在Acti ...

  2. sublime界面主题

    一直以来都是使用的SUBLIME,真的很强大. 最近刚转到linux来学习C,把它重新配置了一遍,默认的字体颜色的搭配已经很不错了.不过界面的样子还是不太习惯.重新安装了下soda这个主题包,惭愧!即 ...

  3. Eclipse-Error:笔记-1

    ylbtech-Eclipse-Error:笔记-1 1.返回顶部 1. Whitelabel Error PageThis application has no explicit mapping f ...

  4. 如何在在页面中清除一个已知的cookie?

    前些天在写一个项目的时候,使用cookie来存储一些用户数据,在用户登出时需要清理以往的数据,对于一个初学者来说,我需要学习如何清除一个已知的cookie. 首先,引入两个js文件: 1.jquery ...

  5. 在windows系统下虚拟机和ubuntu系统的安装和卸载

    一.安装 之前有装过双系统,但是吧,一直用ubuntu系统,很久没进windows之后的某一天,自己再进windows,发现windows系统崩了,我也不知道为什么,找了很多方法没有解决,最后只好重装 ...

  6. HDFS与java API应用

    java代码操作hadoop文件需要用hadoop的jar包,comment,hdfs,yarn,mapreduce,内均有有关jar包,eclipse操作hadoop还需要配置core-site.x ...

  7. OpenStack、KVM、Docker——Docker之后还需要OpenStack吗?

    原文链接:http://news.csdn.net/article_preview.html?preview=1&reload=1&arcid=2823129 Docker从一个新兴的 ...

  8. Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐

    一:错误提示:error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned 英文提示:erro ...

  9. 读书笔记「Python编程:从入门到实践」_3.列表简介

    3.1 列表是什么 列表 由一系列按特定顺序排列的元素组成. 在Python中,用方括号([] )来表示列表,并用逗号来分隔其中的元素. 3.1.1 访问列表元素 指出列表的名称,再指出元素的索引   ...

  10. Swift - 反射(Reflection)的介绍与使用样例(附KVC介绍)

    1,反射(Reflection) 对于C#.Java开发人员来说,肯定都对反射这个概念相当熟悉.所谓反射就是可以动态获取类型.成员信息,同时在运行时(而非编译时)可以动态调用任意方法.属性等行为的特性 ...