学习LCA( 最近公共祖先·二)
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( 最近公共祖先·二)的更多相关文章
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- LCA近期公共祖先
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...
- lca 最近公共祖先
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- hihocoder1067 最近公共祖先·二(tarjin算法)(并查集)
#1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站 ...
- LCA 近期公共祖先 小结
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...
- 【HIHOCODER 1067】最近公共祖先·二(LCA)
描述 上上回说到,小Hi和小Ho用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...
随机推荐
- h5-伸缩布局-小案例
1.伸缩布局案例1-基本页面布局 1.1.html <div class="layout"> <header></header> <mai ...
- Tyvj1952 Easy
%%http://hzwer.com/2838.html 比较巧妙的是原来L^2->(l+1)^1=L^2+2*L+1这样就可以递推了 “?”的贡献及时“o”贡献的1/2. #include&l ...
- 对python中元类的理解
1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: >>> class ObjectCreator(object): ...
- html 鼠标样式 鼠标悬停 小手样式
在style中添加cursor:pointer 实现鼠标悬停变成小手样式 先来一个示例 <div style="float:right"> <a class=&q ...
- ansible下载文件的多种方式
对于ansible来说,下载文件是一个很重要的课题,这是build或者deploy的第一步,通常来讲由于不同项目的差异,可能我们的代码包或者资源文件保存在于http,github,nexus,ftp, ...
- 使用util包里自带的接口和类实现观察者模式
之前的关于观察者模式的文章,是用自己写的Observable接口和Observer接口,然后进行实现.其实官方的util包下自带有实现观察者模式对应的接口和类,可以简化我们的代码结构. 比如我们可以直 ...
- Python csv文件操作
一.open文件打开和with open as 文件打开的区别 file= open("test.txt","r") try: for line in file ...
- QEMU和Firmadyne基本知识|模拟MIPS程序
QEMU QEMU是纯软件实现的一个虚拟化模拟器,几乎可以模拟任何硬件设备,支持多种架构. QEMU安装命令 sudo apt-get install qemu #user mode,包含qemu-m ...
- jquery_ajax 异步提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 18 11 11 网络通信大都数使用的方式 socket
---恢复内容开始--- 浏览器 和 聊天工具 一般都用socket socket 在不同的 语言中的使用流程都大同小异 收 发 关闭 import socket def len() ...