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. oracle 查询char类型的数据

    曾经遇到一个坑. ';//使用PLSQL工具 能查出结果 偏偏在java代码里面查询不出结果. select taskdate from taskinfo where taskdate='201808 ...

  2. Mac系统Snail SVN 精简版配置比较、合并工具:Beyond Compare及破解

    Mac系统 Beyond Compare及破解 前言 在上一篇文章:Mac系统的SVN客户端:Snail SVN 精简版 介绍了在mac系统中svn客户端使用的是snail svn,但是当我想要把本地 ...

  3. JAVAEE 和项目开发(第二课:HTTP协议的特点和交互流程)

    HTTP 的概念和介绍 概念:超文本传输协议(Hyper Text Transfer Protocol) 作用:规范了浏览器和服务器的数据交互 特点: 简单快速:客户向服务器请求服务时,只需传送请求方 ...

  4. MySQL新增数据,存在就更新,不存在就添加

    1.插入一条数据,存在就更新,不存在就更新(必须现有唯一键)使用insert ignore语句: insert ignore into table(col1,col2) values ('a','b' ...

  5. 发送邮件的几种方法(C#发邮件 和 js前台实现都有)C#后台自动发邮件 js发邮件

    1.后台自动发邮件 1)首先设置邮件参数,这里写在configuration里面 <appSettings> <add key="SMTP" value=&quo ...

  6. 转: 十大Intellij IDEA快捷键

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

  7. 判断单链表是否有环,并找出环的入口python

    1.如何判断一个链表是否有环? 2.如果链表为存在环,如果找到环的入口点? 1.限制与要求 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1). 2.思考 2.1判断是否有环 如果链表有环, ...

  8. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war

    创建springboot项目,且不采用<parent>引入springboot时,pom.xml如下: <?xml version="1.0" encoding= ...

  9. 201771010123汪慧和《面向对象程序设计Java》第十七周实验总结

    一.理论部分 1.多线程并发执行中的问题 ◆多个线程相对执行的顺序是不确定的. ◆线程执行顺序的不确定性会产生执行结果的不确定性. ◆在多线程对共享数据操作时常常会产生这种不确定性. 2.线程的同步 ...

  10. error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMT

    项目--属性 ---连接器---命令行 输入: /FORCE:MULTIPLE 编译环境:VS2012SP3