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. css ~ a标签占满父级元素

    width: 100%; height: 100%; display: block;

  2. Ubuntu 安装VirtualBox 虚拟机

    转载 1.终端命令 编辑sources.list ? 1 sudo gedit /etc/apt/sources.list 2.添加 软件源 将下面的地址加入sources.list 的末尾,保存并退 ...

  3. PHP二维数组--去除指定列含有重复项的数组

    给定二维数组: $arr = array( '0' => array('张三',2,3,4), '1' => array('李四',2,3,4), '2' => array('张三' ...

  4. MyBatis整体架构

    Mybatis整体架构 基础支持层 反射模块 Java中的反射很强大,但是还是需要封装的.MyBatis专门提供了反射模块,对元素的反射进行了封装,提供了简洁的API,对反射进行了优化,例如缓存了类的 ...

  5. Mac下使用Hexo搭建个人博客

    Hexo介绍 利用原作者的一句话:A fast,simple&powerful blog framework,powered by Node.js Hexo是基于Node.js的博客平台,He ...

  6. 设置MySQL客户端连接使用的字符集

    设置MySQL客户端连接使用的字符集 时间:2014-03-05    来源:服务器之家    投稿:root 考虑什么是一个"连接":它是连接服务器时所作的事情.客户端发送SQL ...

  7. Java线程——线程之间的通信

    Java中多线程间的通信是怎么实现的? 线程通信的方式: (1)共享变量 线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值.线程A在一个同步块中设置boolean型 ...

  8. svnkit-常用api

    0.功能列表 svnkit功能列表 1.递归获取指定目录下目录和文件,以树形展示[svn Update] 2.获取指定文件和属性(版本号.作者.日期.文件类型) 3.获取指定文件或目录的历史记录(版本 ...

  9. UML-GRASP总结

    对象设计的核心 1).对象交互 2).职责分配

  10. 00java语法基础和课后实践

    一:运行代码,并分析结果 代码1: package reserve; public class Main { public static void main(String[] args) { Size ...