poj 1986 Distance Queries

LCA

题意:LCA模板题,输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可

有人说要考虑不连通的情况,我没考虑AC了,另外可能有u,u这样的询问,不过这不影响,照样是写模板,没有特判,一样能过

 

还是Tarjan快一些

 

LCA转RMQ在线算法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define N 40010
#define M 25int tot;
int __pow[M];
int head[N];
struct edge{int u,v,w,next;
}e[2*N];
int ver[2*N],R[2*N],first[N],dir[N];
int dp[2*N][25];
bool vis[N];inline void add(int u , int v ,int w ,int &k)
{e[k].u = u; e[k].v = v; e[k].w = w;e[k].next = head[u]; head[u] = k++;u = u^v; v = u^v; u = u^v;e[k].u = u; e[k].v = v; e[k].w = w;e[k].next = head[u]; head[u] = k++;
}void dfs(int u ,int dep)
{vis[u] = true; first[u] = ++tot; ver[tot] = u; R[tot] = dep;for(int k=head[u]; k!=-1; k=e[k].next)if( !vis[e[k].v] ){int v = e[k].v , w = e[k].w;dir[v] = dir[u] + w;dfs(v,dep+1);ver[++tot] = u; R[tot] = dep;}
}void ST(int len)
{int K = (int)(log((double)(len)) / log(2.0));for(int i=1; i<=len; i++) dp[i][0] = i;for(int j=1; j<=K; j++)for(int i=1; i+__pow[j]-1 <= len; i++){int a = dp[i][j-1] , b = dp[i+__pow[j-1]][j-1];if(R[a] < R[b]) dp[i][j] = a;else            dp[i][j] = b;}
}int RMQ(int x ,int y)
{int K = (int)(log((double)(y-x+1)) / log(2.0));int a = dp[x][K] , b = dp[y-__pow[K]+1][K];if(R[a] < R[b]) return a;else            return b;
}int LCA(int u ,int v)
{int x = first[u] , y = first[v];if(x > y) swap(x,y);int index = RMQ(x,y);return ver[index];
}int main()
{for(int i=0; i<M; i++) __pow[i] = (1<<i);int n,m,k,str[10];while(scanf("%d%d",&n,&m)!=EOF){k = 0;memset(head,-1,sizeof(head));memset(vis,false,sizeof(vis));while(m--){int u,v,w;scanf("%d%d%d%s",&u,&v,&w,str);add(u,v,w,k);}tot = dir[1] = 0;dfs(1,1);ST(tot);int q;scanf("%d",&q);while(q--){int u,v,lca;scanf("%d%d",&u,&v);lca = LCA(u,v);printf("%d\n",dir[u] + dir[v] - 2*dir[lca]);}}return 0;
}

 

Tarjan离线算法

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 40010
#define M 20010int head[N];
struct edge{int u,v,w,next;
}e[2*N];
int __head[N];
struct ask{int u,v,lca,next;
}ea[M];
int fa[N],ance[N],dir[N];
bool vis[N];inline void add_edge(int u ,int v ,int w ,int &k)
{e[k].u = u; e[k].v = v; e[k].w = w;e[k].next = head[u]; head[u] = k++;u = u^v; v = u^v; u = u^v;e[k].u = u; e[k].v = v; e[k].w = w;e[k].next = head[u]; head[u] = k++;
}inline void add_ask(int u ,int v ,int &k)
{ea[k].u = u; ea[k].v = v; ea[k].lca = -1;ea[k].next = __head[u]; __head[u] = k++;u = u^v; v = u^v; u = u^v;ea[k].u = u; ea[k].v = v; ea[k].lca = -1;ea[k].next = __head[u]; __head[u] = k++;
}int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);
}void Tarjan(int u)
{vis[u] = true;ance[u] = fa[u] = u;for(int k=head[u]; k!=-1; k=e[k].next)if( !vis[e[k].v] ){int v = e[k].v , w = e[k].w;dir[v] = dir[u] + w;Tarjan(v);fa[v] = u;}for(int k=__head[u]; k!=-1; k=ea[k].next)if( vis[ea[k].v] )ea[k].lca = ea[k^1].lca = ance[find(ea[k].v)];
}int main()
{int n,m,q,k; char str[10];while(scanf("%d%d",&n,&m)!=EOF){memset(head,-1,sizeof(head));memset(__head,-1,sizeof(__head));memset(vis,false,sizeof(vis));k = 0;while(m--){int u,v,w;scanf("%d%d%d%s",&u,&v,&w,str);add_edge(u,v,w,k);}scanf("%d",&q);k = 0;for(int i=0; i<q; i++){int u ,v;scanf("%d%d",&u,&v);add_ask(u,v,k);}dir[1] = 0;Tarjan(1);for(int i=0; i<q; i++){int s = i*2 , u = ea[s].u , v = ea[s].v , lca = ea[s].lca;printf("%d\n",dir[u] + dir[v] - 2*dir[lca]);}}return 0;
}

 

转载于:https://www.cnblogs.com/scau20110726/archive/2013/05/27/3102068.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293568.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【.NET 遇上 GraphQL】 ChilliCream 平台介绍

ChilliCreamhttps://chillicream.com/https://github.com/ChilliCream/hotchocolateChilliCream 平台包含了四个产品, Hot Chocolate, Banana Cake Pop, Strawberry Shake, 平台提供开发人员工具和服务以加快整个开发过程。Hot ChocolateHot Chocolate 是 .NET 平台下的一个开源…

.NET 的 WebSocket 开发包比较

编者按 本文出现在第三方产品评论部分中。在这一部分的文章只提供给会员&#xff0c;不允许工具供应商用来以任何方式和形式来促销或宣传产品。请会员报告任何垃圾信息或广告。 Web项目常常需要将数据尽可能快地推送给客户&#xff0c;必要时无需等待客户端请求。对于与用户之间…

《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

《CMake实践》笔记一&#xff1a;PROJECT/MESSAGE/ADD_EXECUTABLE 《CMake实践》笔记二&#xff1a;INSTALL/CMAKE_INSTALL_PREFIX 《CMake实践》笔记三&#xff1a;构建静态库与动态库 及 如何使用外部共享库和头文件 四、更好一点的Hello World 没有最好&#xff0c;只有更好…

14年前,林国强院士发现自己学生论文无法重复后,是这样处理的

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;iNature让我们把时间拨回至 2007 年 3 月&#xff0c;当年&#xff0c;一封以林国强院士的名义发表的公开信&#xff0c;在网络上流传。信中披露&#xff0c;林院士发现自己的一名博士生发表在权威期刊《美国化学会志…

C++ char[] 与 string 转换

处理档案资料&#xff0c;最常使用 char[] 或 string 来储存字串&#xff0c;前者是 字元阵列 &#xff0c;为C所拥有&#xff0c;当然C也可以使用&#xff1b;而后者是C独有的 字串类别 &#xff0c;可以产生字串物件。在使用C处理字串时&#xff0c;时常会char[]和string互转…

支持向量机通俗导论(理解SVM的三层境界)

支持向量机通俗导论&#xff08;理解SVM的三层境界&#xff09; 作者&#xff1a; July &#xff1b; 致谢&#xff1a; pluskid、 白石、J erryLead。出处&#xff1a;结构之法算法之道 blog 。 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的&#…

WPF 实现加速小火箭~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 SpeedRocketsExample.xaml 代码如下。<Window x:Class"WPFDevelopers…

第二十四天 多维数组

经过前面对一维数组和二维数组的学习&#xff0c;我们充分的掌握了数组的定义和使用&#xff0c;接下来我们该学习的是&#xff1a;多维数组。比较简单的方法&#xff0c;想要提高数组的维数只要在声明的时候在索引多加一个中括号即可。比如&#xff1a;我们要声明三维数组那么…

最懂男人心的内裤,戳100个洞透气,超舒服

▲ 点击查看有什么日用品&#xff0c;需要盆友们时不时就经常补货买买买的&#xff1f;除了家里的酱油、纸巾、沐浴露&#xff0c;还有一样hin重要&#xff0c;那就是内裤&#xff01;除了洗澡的空挡&#xff0c;内裤就一直穿在身上&#xff0c;可以说内裤是比女友还亲、比手机…

搬家到此,嘿嘿

希望能够把遇到的技术问题给记录起来&#xff0c;给我加油吧&#xff01; 之前一直在网易博客上记录&#xff0c;刚搬到此地&#xff0c;尽快习惯下来啦转载于:https://www.cnblogs.com/lwjlss/p/5682533.html

C++ throw:抛出自己的异常

throw 是C中的关键字&#xff0c;用来抛出异常。如果不使用 throw 关键字&#xff0c;try 就什么也捕获不到&#xff1b;上节提到的 at() 函数在内部也使用了 throw 关键字来抛出异常。throw 既可以用在标准库中&#xff0c;也可以用在自定义的函数中&#xff0c;抛出我们期望的…

git - svn 平滑到 git

1. 建立自己的git仓库&#xff0c;需要是空git仓库 2. checkout 你的 git仓库 3. svn忽略.git文件&#xff0c;忽略.git .gitignore 4. 把 .git文件拷到你的 svn仓库 5. git 上传文件 ————可以用&#xff0c;但是不符合我的情况———— 1. 所有需要用到的&#xff1a;git…

Logback也爆漏洞了,总结下最近log相关的几个漏洞

大家好&#xff0c;我是君哥&#xff0c;周末又要结束了。前些天 Apache Log4j2 接连报了几个重大漏洞&#xff0c;好在我们的系统使用的 logback&#xff0c;可当我们正庆幸的时候&#xff0c;logback 也爆出漏洞了。今天我们一起来看一下这几个漏洞。CVE-2021-42550先看一下官…

vim配置php语法高亮

安装vim之后&#xff0c;将php语法高亮插件 php.vim&#xff0c;放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载&#xff1a;http://www.vim.org/scripts/script.php?script_id1571 然后配置vim配置文件 vimrc 在这里 /etc/vimrc ,增加一行 “s…

九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#xff09;&#xff0c;blog已经停了3个多月&#xff0c;而在那之前&#xff0c;自开博以来的21个月每…

C++ exception类

语言本身或者标准库抛出的异常都是 exception 的子类&#xff0c;称为标准异常&#xff08;Standard Exception&#xff09;。你可以通过下面的语句来匹配所有标准异常&#xff1a; try{ //可能抛出异常的语句}catch(exception &e){ //处理异常的语句} 之所以使用引用…

拿了年终奖后,发现自己又拖后腿了?对不起,可能事实并没有那么糟糕...

全世界只有3.14 % 的人关注了爆炸吧知识不平凡的2020年早已过去了&#xff0c;打工人们已经跨过了2021年的门槛。2021年将会怎么样&#xff0c;那只有到2021年结束后我们才会知道。但我们的情绪常常毫无例外地会被“年终奖”这个关键词所扰动&#xff0c;无论在什么时候&#x…

JAVA-MyBatis ORM

MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。 iBATIS一词来源于“internet”和“abatis”的组合&#xff0c;是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects&#xff08;DAO&#xff09;&#xff0c;同时还提供一个利用这…

Leetcode: Single Number

Given an array of integers, every element appears twice except for one. Find that single one.Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? Analysis: 需求里面要求O(N)时间以及无额外空间&…

如何使用 C# 压缩单个文件?

咨询区 user3362735我的项目有一个需求&#xff0c;需要对 文件夹 下的文件进行压缩&#xff0c;我用 ZipFile.CreateFromDirectory 方法发现并不能成功&#xff0c;但我对整个文件夹压缩是没有问题的&#xff0c;请问我该如何正确实现&#xff1f;回答区 John Koerner可以借助…