http://poj.org/problem?id=1986

离线找u,v之间的最小距离(理解推荐)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char s[];
const int M=1e5+;
const int N=2e4+;
struct node{
int v,w,nextt;
}e[M];
struct NODE{
int v,dis,nextt;
}g[M];
int fa[M],head[M],Head[M],vis[M],dis[M];
int tot,TOT;
void addedge(int u,int v,int w){
e[tot].v=v;
e[tot].w=w;
e[tot].nextt=head[u];
head[u]=tot++;
e[tot].v=u;
e[tot].w=w;
e[tot].nextt=head[v];
head[v]=tot++;
}
///存储询问的u,v
void ADDedge(int u,int v){
g[TOT].v=v;
g[TOT].nextt=Head[u];
Head[u]=TOT++;
g[TOT].v=u;
g[TOT].nextt=Head[v];
Head[v]=TOT++;
}
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void LCA(int u){
fa[u]=u;
vis[u]=true;
for(int i=head[u];~i;i=e[i].nextt){
int v=e[i].v;
if(!vis[v]){
dis[v]=dis[u]+e[i].w;
LCA(v);
fa[v]=u;
}
}
for(int i=Head[u];~i;i=g[i].nextt){
int v=g[i].v;
if(vis[v]){
g[i].dis=dis[u]+dis[v]-*dis[Find(v)];
g[i^].dis=g[i].dis;
}
}
}
int main(){
int n,m;
memset(head,-,sizeof(head));
memset(Head,-,sizeof(Head));
scanf("%d%d",&n,&m);
while(m--){
int u,v,w;
scanf("%d%d%d%s",&u,&v,&w,s);
addedge(u,v,w);
}
int k;
scanf("%d",&k);
for(int i=;i<k;i++){
int u,v;
scanf("%d%d",&u,&v);
ADDedge(u,v);
}
LCA();
for(int i=;i<TOT;i+=){
printf("%d\n",g[i].dis);
}
return ;
}

http://hihocoder.com/problemset/problem/1067

tangin+离线

#include<bits/stdc++.h>
using namespace std;
const int M=1e5+;
struct node{
int to,index;
node (int v,int index){
this->to=v;
this->index=index;
}
};
vector<int>graph[M];
vector<node>e[M];
bool sign[M];
map<int,string>str;
map<string,int>indx;
int ans[M]; int f[M],color[M];
int tot,n,m,root;
void init(){
tot=;
indx.clear();
memset(sign,false,sizeof(sign));
memset(color,,sizeof(color));
memset(ans,,sizeof(ans));
for(int i=;i<M;i++){
graph[i].clear();
e[i].clear();
f[i]=i;
}
}
int find(int x){
return x==f[x]?x:f[x]=find(f[x]);
}
int get_index(string x){
if(indx.count(x))
return indx[x];
indx[x]=++tot;
str[tot]=x;
return tot;
}
void input(){
cin>>n;
for(int i=;i<=n;i++){
string name1,name2;
cin>>name1>>name2;
int a=get_index(name1);
int b=get_index(name2);
graph[a].push_back(b);
sign[b]=true;
}
cin>>m;
for(int i=;i<=m;i++){
string name1,name2;
cin>>name1>>name2;
int a=get_index(name1);
int b=get_index(name2);
e[a].push_back(node(b,i));
e[b].push_back(node(a,i));
}
}
void targin(int u){
color[u]=;
for(int i=;i<e[u].size();i++){
int ID=e[u][i].index;
if(ans[ID])
continue;
int v=e[u][i].to;
if(color[v]==)
//0代表v未访问过
continue;
if(color[v]==)
//1代表正在访问,所以u和v的最近公共祖先就是v
ans[ID]=v;
if(color[v]==)
//2代表访问完毕的点,所以u和v的最近公共祖先就是v当前的祖先
ans[ID]=find(v);
}
for(int i=;i<graph[u].size();i++){
int v=graph[u][i];
targin(v);
//一个节点dfs完后,标记vv为访问完毕的点,并更新父节点
color[v]=;
f[v]=u;
}
}
void solve(){
for(int i=;i<=n;i++)
if(!sign[i])
root=i;
targin(root);
for(int i=;i<=m;i++)
cout<<str[ans[i]]<<endl;
}
int main(){
init();
input();
solve();
return ;
}

学习LCA( 最近公共祖先·二)的更多相关文章

  1. hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]

    传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  3. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

  4. lca 最近公共祖先

    http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...

  5. LCA(最近公共祖先)模板

    Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...

  6. CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )

    CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...

  7. hihocoder1067 最近公共祖先·二(tarjin算法)(并查集)

    #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站 ...

  8. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  9. 【HIHOCODER 1067】最近公共祖先·二(LCA)

    描述 上上回说到,小Hi和小Ho用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...

随机推荐

  1. prometheus配置简介

    参考网页:https://my.oschina.net/wangyunlong/blog/3060776 global: scrape_interval:             15s evalua ...

  2. 转: 十大Intellij IDEA快捷键

    Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论.每个人都有自己的最爱,想排出个理想的榜单还真是困难.以前也整理过Intellij的快捷键,这次就按 ...

  3. Zookeeper--复制模式安装

    参考: https://www.cnblogs.com/lsdb/p/7297731.html https://zookeeper.apache.org/doc/r3.4.13/zookeeperSt ...

  4. Idea的类中使用实体类(有@Data注解)的Get/Set方法报错

    今天从svn上面下了一个maven项目,导入到Idea中之后,发现有的类会使用实体类的Set/Get方法(全报错),导致该问题的原因就是因为实体类中没有这个方法,代码类似如下: @Data publi ...

  5. if case for while

    #!/bin/basha=$1if [ $a ] #判断$1是否为空then #非空echo "the input is No:$a"exit 0else #空read -p &q ...

  6. .NET httpClient Post请求,GET请求方法

    1.后端是WebAPI,POST请求,修饰符是[FromBody]的字符串,[FromBody]修饰的时候数据是来自body部分,而不是来自url部分,所以后端取值会自动映射出数据,比如后端是这样的, ...

  7. 第32&35章 数据库的安装&存储实力的管理

    第32章 数据库的安装IO取决于磁盘的个数和接口带宽 版本安装顺序是从低到高存储架构师 第35章 存储实例的管理ASM配置说白了就是ORACLE自己的,不通过操作系统对磁盘进行管理.fdisk -l查 ...

  8. Java中的合并与重组(下)

    通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. Java中的合并与重组上部分链接:https://www.cnblogs.com/youruike1/p ...

  9. C/C++学习笔记-gcc动态库及静态库

    gcc工作流程 1.预处理 gcc -E 2.编译 gcc -S 3.汇编 gcc -c 4.链接 没参数制作静态库: 1.命名规则:libMyName.a2.制作步骤: ①.生成.o gcc -c ...

  10. 吴裕雄--天生自然 JAVASCRIPT开发学习:Window - 浏览器对象模型

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...