简单的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. Java中对象与引用

    初学Java 时.在非常长一段时间里,总认为基本概念非常模糊. 后来才知道.在很多Java 书中.把对象和对象的引用混为一谈. 假设分不清对象与对象引用,那实在没法非常好地理解以下的面向对象技术.把自 ...

  2. VS2013+ffmpeg开发环境搭建-->【转】

    本文转载自:http://blog.csdn.net/qq_28425595/article/details/51488869 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天整理资料时,发 ...

  3. etcd创建集群并增加节点

    下载安装 从这下载https://github.com/coreos/etcd/releases/download/v3.3.2/etcd-v3.3.2-linux-amd64.tar.gz tar ...

  4. Spark Scala语言学习系列之完成HelloWorld程序(三种方式)

    三种方式完成HelloWorld程序 分别采用在REPL,命令行(scala脚本)和Eclipse下运行hello world. 一.Scala REPL. windows下安装好scala后,直接C ...

  5. 如何在C#中运行数学表达式字符串

    方法1:利用DataTable中的Compute方法 1 string expression = "1+2*3"; 2 DataTable eval = new DataTable ...

  6. windows7 安装 choco

    windows7 安装 choco: cmd下: @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -N ...

  7. web拼图错误分析

    老师要求用web制作一个拼图游戏. 发现的问题:点击随机生成拼图的按钮后,打乱的图片会出现无法还原的情况. 发现过程:每次生成一个拼图后会测试它怎么拼回去,结果发现有时候拼不回去. 数学原理:如果两个 ...

  8. Fragment_动态加载

    1.新建Fragment的XML布局文件. 2.在activity.xml中添加需要加载Fragment.列如: <?xml version="1.0" encoding=& ...

  9. Hibernate框架学习(十)——查询优化

    一.类级别查询 1.get方法:没有任何策略,调用即立即查询数据库加载数据. 2.load方法:是在执行时不发送任何SQL语句,返回一个对象,使用该对象时才执行查询:应用类级别的加载策略. 1> ...

  10. hdu3861 The King’s Problem 强连通缩点+DAG最小路径覆盖

    对多校赛的题目,我深感无力.题目看不懂,英语是能懂的,题目具体的要求以及需要怎么做没有头绪.样例怎么来的都不明白.好吧,看题解吧. http://www.cnblogs.com/kane0526/ar ...