学习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用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...
随机推荐
- Vue点击按钮下载对应图片
最近有用到点击某个按钮 自动下载对应图片,可是对于浏览器不同的问题,会有‘个别’浏览器出现不能下载的或者下载的效果不同等的问题, 可以直接用创建canvas方法: 定义图片地址Img: "w ...
- weex 随笔
1.三大模块: <template>:样板,内容区 <style>:css <script>: js <script> export default{ ...
- centos6.7搭建局域网ntp服务器
修改/etc/ntp.conf文件 restrict xxx nomodify notrap nopeer noquery #xxx 此处配置本地IP地址restrict 12 ...
- Loadrunner安装与破解
一.安装loadrunner 1. 点击setup.exe 2. 点击安装完整程序 3. 点击确定,安装必需程序 4. 安装vc2005的时候报了如下错,导致无法继续安装,没有报错可跳过第五步 5. ...
- 【新年呈献】高性能网络通信框架 HP-Socket v5.7.1
项目主页 : http://www.oschina.net/p/hp-socket 开发文档 : https://www.docin.com/p-2287339564.html 下载地址 : http ...
- swift中block的使用
在OC中习惯用block来传值,而swift中,block被重新定义了一下,叫闭包: 使用的技巧:谁定义谁传值: 案例使用A.B控制器: 1~4步在B中执行,最后在A中执行: - B控制器: 1- ...
- Django中使用ORM
一.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数 ...
- 201809-2 买菜 Java
思路: 顺序读入,例如:小H装车的时间段为[1,3],小W装车的时间段为[2,4],重叠部分为[2,3],记在数组times[2]中.最后输出时判断数组times中值大于1的(其实就是2),即为重叠部 ...
- ansible异步任务
转载于简书博客 https://www.jianshu.com/p/3962bf94ae70 ansible方便在于能批量下发,并返回结果和呈现.简单.高效. 但有的任务执行起来却不那么直接,可能会花 ...
- 基于图灵api的Python机器人
一.注册图灵机器人 先注册并登录图灵机器人官网: 点击创建机器人 复制机器人的key 二.搭建Python机器人 Python版本:3.6 注意替换第三行代码的apikey import reques ...