HDU 2874
简单的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的更多相关文章
- HDU 2874 Connections between cities (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意是给你n个点,m条边(无向),q个询问.接下来m行,每行两个点一个边权,而且这个图不能有环路 ...
- HDU 2874 Connections between cities(LCA离线算法实现)
http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...
- HDU 2874 Connections between cities(LCA(离线、在线)求树上距离+森林)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目大意:给出n个点,m条边,q个询问,每次询问(u,v)的最短距离,若(u,v)不连通即不在同 ...
- HDU 2874 Connections between cities(LCA+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2874 [题目大意] 有n个村庄,m条路,不存在环,有q个询问,问两个村庄是否可达, 如果可达则输出 ...
- hdu 2874(LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 思路:近乎纯裸的LCA,只是题目给出的是森林,就要判断是否都在同一颗树上,这里我们只需判断两个子 ...
- 【HDU 2874】Connections between cities(LCA)
dfs找出所有节点所在树及到树根的距离及深度及父亲. i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2. #include <cstring> #in ...
- hdu 2874 Connections between cities [LCA] (lca->rmq)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Hdu 2874 Connections between cities
题意: 城市 道路 没有环 不一定连通的树 求两城市的最短距离 设想一下就是很多小树 那好办 思路: lca离线算法 然后有个技巧就是 每次我们tarjan一棵树不是最后树的节点都访问过并且孩子全 ...
- HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
- hdu 2874(裸LCA)
传送门:Problem 2874 https://www.cnblogs.com/violet-acmer/p/9686774.html 改了一晚上bug,悲伤辣么大,明天再补详细题解 题解: 题目中 ...
随机推荐
- java学习笔记(二)图形用户接口
这个学期主要放在ACM比赛上去了,比赛结束了.不知不觉就15周了,这周就要java考试了,复习一下java吧.java的学习的目的还是让我们学以致用,让我们可以运用java开发一下小项目.而不是单单应 ...
- 【HDOJ 1009】 CRB and String
[HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...
- C语言 - 头文件使用案例
源代码分门别类管理,通过头文件. 放置一些函数声明,变量声明,常量定义,宏定义. hotel.h #ifndef HOTEL_H_INCLUDED #define HOTEL_H_INCLUDED # ...
- nyoj--744--蚂蚁的难题(一)
蚂蚁的难题(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 小蚂蚁童鞋最近迷上了位运算,他感觉位运算非常神奇.不过他最近遇到了一个难题: 给定一个区间[a,b],在 ...
- php如何将网上的图片下载到本地
<?phpheader("Content-Type: application/force-download");header("Content-Dispositio ...
- Redis List 命令技巧
1.实现栈的功能(先进后出) lpush + lpop = stack > lpush mylist (integer) > lpop mylist " > lpop my ...
- 部署hexo后github pages页面未更新或无法打开问题
title: 部署hexo后github pages页面未更新或无法打开问题 date: 2018-03-30 15:34:29 categories: methods tags: hexo gith ...
- 在Mac OSX上安装ffmpeg && ffmpeg命令行将h264封装为mp4
ffmpeg功能强大,可以通过命令行来对音视频进行处理.为了使用其功能,我在Mac上对其进行了安装. 我的Mac OS X 系统版本:OS X Yosemite, 10.10.14 关于ffmpeg在 ...
- 【转载】java调用C++写的DLL
用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...
- 6 Python+Selenium的元素定位方法(CSS)
[环境] python3.6+selenium3.0.2+Firefox50.0+win7 [定位方法] 1.方法:find_element_by_css_selector('xx') CSS的语法比 ...