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,悲伤辣么大,明天再补详细题解 题解: 题目中 ...
随机推荐
- nyoj--102--次方求模(快速幂)
次方求模 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100) 每组测试只有一行,其 ...
- Elo rating system(Elo 打分体系)
A.B 两个待比较.评价的对象,分别打分为 RA,RB,则各自获胜的期望值为: ⎧⎩⎨⎪⎪⎪⎪⎪⎪EA=11+10(RB−RA)/400.EB=11+10(RA−RB)/400. 不妨令 QA=10R ...
- python 3.7 replace函数的坑
使用replace时必须用 str=str.replace(old,new) 如果用 str.replace(old,new)会不起作用. 注意:若str中没有old变量,也不会报错 应用: 练习题 ...
- Lucene中Analyzer语句分析
Lucene中Analyzer语句分析,利用lucene中自带的词法分析工具Analyzer,进行对句子的分析. 源代码如下: package com.test; import java.io.IOE ...
- C#操作Mysql类
using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Text. ...
- C#解除某类警告。。。。。。。。。。
C#预处理器指令取消不必要的警告 今天将自己写的一个类库生成一个DLL后,想把注释也加进去.... 方法:在属性->生成选项卡->XML文档文件(勾选)(生成的文件名不能修改,使用时必须跟 ...
- C# 线程知识汇总
一.基本概念 进程(process)是windows系统中你的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或者多个线程.线程是操作 ...
- redis启动加载过程、数据持久化
背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类 ...
- 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5
前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...
- 腾讯云TrustAsia DV SSL CA证书的申请及使用
1.证书申请及管理 对于已经拥有域名及公网服务器的用户,可以通过腾讯云申请TrustAsia DV SSL CA证书,证书申请流程包含填写基本信息和域名认证两步,非常清晰和简单,没有什么需要过 ...