poj 1986 tarjan/rmq(LCA问题)

html2canvas 返回的toDataURL()数据为 data:,的解决方法 html2canvas 返回的toDataURL()数据为 data:,的解决方法 我在使用html2canvas的使用, 发现toDataURL() 返回的数据为data:, 而且将数据设置为img的src属性,图片也不能正常显示,我尝试了很多方法,也没有解决出来,经过我不断的百度+自己尝试,终于解决了这个问题。 代码: 这段代码是没有任何问题的,标准html2canvas的demod代码,但就是无法正常将图片previewImg 渲染出来,dataURL 我打印的结果为 data:, 错误的原因是, 阅读详情

题意:给出一棵树,求任意两点的最小距离。查询为多组。

思路:LCA(Least Common Ancestor最近公共祖先)。设LCA(X, Y) = L,dist(X)表示X到根节点的距离(Y同理),那么X到Y的路径长度就是dist(X) + dist(Y) - 2 * dist(L)。

离线方法为tarjan算法,本质是深搜+并查集。复杂度O(m+q),q为查询的对数。

在线方法为rmq,(具体算法参见http://ayzk.wordpress.com.cn/archives/14),复杂度为O(nlogn)+O(q).

tarjan算法:

#include <stdio.h>
#include <string.h>
#define N 10005
#define M 40005
struct edge{
	int y,w,next;
}e[M<<1];
struct query{
	int y,index,next;
}q[N<<1];
int res[N],firstq[M],firste[M],visited[M],root[M],dis2root[M];
int n,m,top_q,top_e;
void init(){
	int i;
	top_q = top_e = 0;
	memset(res,0,sizeof(res));
	memset(firstq,-1,sizeof(firstq));
	memset(firste,-1,sizeof(firste));
	memset(visited,0,sizeof(visited));
	memset(dis2root,0,sizeof(dis2root));
	for(i = 0;i<=n;i++)
		root[i] = i;
}
void adde(int x,int y,int w){
	e[top_e].y = y;
	e[top_e].w = w;
	e[top_e].next = firste[x];
	firste[x] = top_e++;
}
void addq(int x,int y,int index){
	q[top_q].y = y;
	q[top_q].index = index;
	q[top_q].next = firstq[x];
	firstq[x] = top_q++;
}
int find(int x){
	if(root[x] == x)
		return x;
	else return root[x] = find(root[x]);
}	
void dfs(int x,int dis){
	int j,y;
	visited[x] = 1;
	for(j = firste[x];j!=-1;j=e[j].next){
		y = e[j].y;
		if(!visited[y]){
			dis2root[y] = dis+e[j].w;
			dfs(y,dis+e[j].w);
			root[y] = x;
		}
	}
	for(j = firstq[x];j!=-1;j=q[j].next)
		if(visited[q[j].y]){
			res[q[j].index] = dis2root[x]+dis2root[q[j].y]-2*dis2root[find(q[j].y)];
		}
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d %d",&n,&m)!=EOF){
		int i,j,a,b,w;
		char ch;
		init();
		for(i = 0;i<m;i++){
			scanf("%d %d %d %c",&a,&b,&w,&ch);
			adde(a,b,w);
			adde(b,a,w);
		}
		scanf("%d",&m);
		for(i = 0;i<m;i++){
			scanf("%d %d",&a,&b);
			addq(a,b,i);
			addq(b,a,i);
		}
		dfs(1,0);
		for(i = 0;i<m;i++)
			printf("%d\n",res[i]);
	}
	return 0;
}

rmq算法:

#include <stdio.h>
#include <string.h>
#include <math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define clc(s,t) memset(s,t,sizeof(s))
#define swap(a,b,k) {k=a;a=b;b=k;}
#define N 40005
struct edge{
    int y,w,next;
}e[N*2];
int first[N],top,n,m,q,dis[N];
int flag[N<<1],r[N],d[N<<1],dp[N<<1][20],len;
void init(){
    clc(first,-1);
    clc(r, 0);
    clc(dis, 0);
    top = len = 0;
}
void add(int x,int y,int w){
    e[top].y = y;
    e[top].w = w;
    e[top].next = first[x];
    first[x] = top++;
}
void dfs(int x,int fa,int dep){
    int i;
    for(i = first[x];i!=-1;i=e[i].next)
        if(e[i].y != fa){
            dis[e[i].y] = dis[x]+e[i].w;
            flag[++len] = e[i].y;
            r[e[i].y] = len;
            d[len] = dep+1;
            dfs(e[i].y,x,dep+1);
            flag[++len] = x;
            d[len] = dep;
        }
}
void st(int n){
    int i,j;
    int k = log((double)(1+n))/log(2.0);
    for(i = 1;i<=n;i++)
        dp[i][0] = i;
    for(j = 1;j<=k;j++)
        for(i = 1;i+(1<<j)-1<=n;i++){
            if(d[dp[i][j-1]] < d[dp[i+(1<<(j-1))][j-1]])
                dp[i][j] = dp[i][j-1];
            else
                dp[i][j] = dp[i+(1<<(j-1))][j-1];
        }
}
int query(int a,int b){
    int k = log((double)(b-a+1))/log(2.0);
    if(d[dp[a][k]] < d[dp[b-(1<<k)+1][k]])
        return dp[a][k];
    return dp[b-(1<<k)+1][k];
}
int main(){
    int i,a,b,w,lca;
    char ch;
    init();
    scanf("%d %d",&n,&m);
    for(i = 0;i<m;i++){
        scanf("%d %d %d %c",&a,&b,&w,&ch);
        add(a,b,w);
        add(b,a,w);
    }
    scanf("%d",&q);
    r[1] = flag[++len] = 1;
    dfs(1,-1,0);
    st(n*2-1);
    while(q--){
        scanf("%d %d",&a,&b);
        if(r[a]>r[b]){
            swap(a,b,w);
        }
        lca = flag[query(r[a], r[b])];
        printf("%d\n",dis[a]+dis[b]-2*dis[lca]);
        
    }
    return 0;
}


VXWorks6.9 + Workbench3.3 开发环境部署 VxWorks6.9 + Workbench3.3的安装部署,以及简单示例项目的创建、编译和运行 阅读详情

相关推荐

windows sever2019切换Linux内核

安装docker engine后,内核是windows,很多镜像都无法安装使用。 一,在https://github.com/linuxkit/lcow/release 下载最新版本release.zip,我使用了如下版本。 二,新建文件夹C:\Program Files\Linux Containers ,把release.zip(不要解压)放入此文件夹 三,编辑docker配置文件( C:\ProgramData\docker\config\daemon.json) ,电脑中没有该文件,新建一

记录日常疑问 3875

POJ 1986 RMQ+LCA

题意给一堆点,一堆边,问一个点到另一个点的最短距离。题解其实就是LCA的模板题,只不过题目好坑啊,数据范围在1984这道题里,看错了数据范围,然后一直RE。代码#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<cmath> #include<queu

zhenlingcn的博客 316

告别理论!手把手教你用Patran/Nastran搞定机翼颤振分析(附完整模型文件)

本文提供了一份详细的机翼颤振分析实战指南,使用Patran/Nastran软件从零开始构建完整分析模型。涵盖几何建模、网格划分、模态分析到气动弹性耦合的全流程,特别适合航空航天领域工程师学习颤振分析技术。教程包含完整模型文件和实用脚本,帮助读者快速掌握这一关键飞行器设计技能。

weixin_30879169的博客 543

poj1986 lca(tarjan算法)

#include #include #include const int maxn=90005;//数组要开大一点 using namespace std; int head[maxn],head1[maxn],fa[maxn],ranks[maxn],dist[maxn],vis[maxn],n,m,from,to,longs,query; int index,idx; struct Edge{

RockyHOO1209的博客 429

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

国密证书实战:在CentOS 7上构建GmSSL私有CA与完整证书链

本文详细介绍了在CentOS 7操作系统上,使用GmSSL工具构建私有国密证书颁发机构(CA)与完整证书链的实战指南。内容涵盖从部署GmSSL、创建国密根CA、签发服务器与客户端证书,到生产环境安全加固与最佳实践的全流程,旨在帮助系统管理员和安全工程师建立统一、可控的内部国密安全通信体系。

jenkins8butler的博客 496

poj 1986(tarjan求树中两个节点的距离)

给出一棵树 询问 a-b的路径长度是多少 给出一棵树 询问 a-b的路径长度是多少 dist【i】记录节点i到根的距离长度 对于每次询问,用RMQ预处理的LCA可以在线回答每个询问, ans=dist[a]+dist[b]-2*dist[LCA(a,b)]; Source Code Problem: 1986 User: 1013101127 Memory: 18576K Tim

Weiguang_123的专栏 1233

2021-3-20组会 无监督训练下的音频分离 (音源分离) Unsupervised Audio Source Separation Using Generative Priors

0. 说明 一片具体论文的综述

ruclion的专栏 1350

LCA+poj1986

Language: Default Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 9081   Accepted: 3178 Case Time Limit: 1000MS Description Farme

龙崎的专栏 768

关于112G和56G PAM4信号的有效回损(ERL)

本文探讨了回波损耗(RL)对高速数字通信系统性能的影响,重点分析了时域信道运行裕度(COM)与频域回波损耗指标的关联性。研究表明,传统频域回波损耗指标在预测系统性能时存在假阳性/假阴性问题,特别是对PAM-4信号系统影响更为显著。通过引入基于时域脉冲响应的有效回波损耗(ERL)指标,并结合判决反馈均衡器(DFE)的补偿效应,可更准确评估系统性能。实验表明,短封装器件虽然频域回波损耗较差,但在实际系统中表现更优。研究提出通过时域门控加权等方法优化ERL计算,为高速互连设计提供了更可靠的性能评估框架。

小孟同学的博客 292

心理学量表汇总 50多个 附下载

目录一、心理健康与精神病态量表二、行为问题量表三、人格评估量表四、智力测验一、心理健康与精神病态量表1.一般症状自评量表(SCL-90)症状自评量表 (The self-report symptom inventory ,Symptom checklist ,90,简称 SCL90) 有 90 个评定项目 , 每个项目分五级评分 , 包含了比较广泛的精神病症状学内容, 从感觉、 情 感、思维、意识、行为直至生活习惯、人际关系、饮食等均有涉及,能准确刻划被试的自觉 症状,能较好地反映被试的问题及其严重程度和变

南七小僧的学海无涯 1904

POJ 1986 Distance Queries Tarjan算法求最近公共祖先+前向星

第一次尝试自己写博客,如果有什么不好的地方还请大家多多批评指正~传送门:POJ 1986题目大意:John是一个农场主,他的牛都懒散惯了,所以拒绝按照John所选的路走。John就想找一条最短的路。本题输入前半部分与“导航噩梦”相同,在每组数据之后会有一个整数K,接下来K行每行一个“距离询问”。每个距离询问包含两个整数,表示John想要计算距离的两个农场的编号。Sample Input7 6 1 ...

zuzhiang的博客 613

STM32实战开发(133):基于STM32的智能GPS定位跟踪系统开发

本文详细介绍了如何基于STM32开发一个智能GPS定位跟踪系统。系统使用NEO-6M GPS模块获取实时定位数据,并通过SIM800L GPRS模块将定位信息上传到远程服务器。通过OLED屏幕实时显示位置数据,使用SD卡存储历史轨迹,并提供蜂鸣器报警功能。项目实现了GPS定位数据的获取、解析、存储和传输,为智能定位系统提供了完整的解决方案。

2201_76125393的博客 1643

[POJ 1986] Distance Queries (LCA)

Distance Queries LCA问题: http://www.cppblog.com/Icyflame/archive/2009/07/04/88987.html Tarjin (离线算法) http://hi.baidu.com/billdu/item/9938ed34ab9416352e20c41f DFS + RMQ (在线算法)

SIOFive的专栏 924

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LCA问题

LCA(Least Common Ancestors),即最近公共祖先:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先)。        使用RMQ解决LCA问题,一篇不错的文档http://wenku.baidu.com/view/392c7023dd36a32d73758193.html,解释了两者之间的转换。 在线算法DFS+ST描述(思想是:将

新博客地址:sensirly.github.io 2139

POJ1986 Distance Queries

本题中题目叙述没有给出,但是测试数据中默认的条件为:本题的图必为一棵树!否则是不可能在1s的时间内实现的。 知道了这是一棵树,那么下面的问题就简单了:我们只需要求出询问的两个点的LCA。 求LCA有三种算法:一种是离线Tarjan算法,一种是在线O(n^2)-O(1)算法,还

这个诗人不懂浪漫 909

POJ 1986 LCA,tarjan实现

Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4010   Accepted: 1418 Case Time Limit: 1000MS Description Farmer John's cows refused to run in his mar...

bingshen的专栏 1664

POJ 1986 Distance Queries(LCA)

第一次做LCA的题,梁神说Tarjan和RMQ的模版都要有,然后我就顺便找了一下。题意很简单,就是给一些边,边上有权值,然后询问两点之间的最短距离。貌似找最近公共祖先的模版要改一些地方,我直接就在网上找新模版了,从这个题我知道STL的vector有多慢了,用前向星实现的Tarjan算法比STL快了近一秒,伤不起,打算以后就用前向星了,把模版贴在这里吧。 Tarjan #include #inc

XDU_Truth的专栏 525

POJ上的LCA问题小节(转)

<br />POJ上的LCA问题小节(转)<br /> <br />1330和1470是入门系列,可以说基本上时用来测试板子的<br />1986比上面两个稍微多了一个距离,但是本质还是一样的对于一个询问d[u,v]=dis[u]+dis[v]-dis[LCA(u,v)]<br />可以一边LCA一边动态修改当前点到根的距离<br />3728其实就是记录的东西多了一点(1)孩子到父亲最大价格(2)孩子到父亲最小价格(3)从自己到祖先的最大收益 (4)从祖先到自己的最大收益,这里的分情况讨论只需要手动的

hqd_acm的专栏 1469

LCA笔记

LCA&训练

C_eeking的博客 374

poj 1986

<br /> Distance QueriesTime Limit: 2000MS Memory Limit: 30000KTotal Submissions: 4350 Accepted: 1537Case Time Limit: 1000MS<br />DescriptionFarmer John's cows refused to run in his marathon since he chose a path much too long for their leisurely lifestyle.

志当存高远 1207

最近公共祖先:LCA及其用倍增实现 +POJ1986

Q:为什么我在有些地方看到的是最小公共祖先? A:最小公共祖先是LCA(Least Common Ancestor)的英文直译,最小公共祖先与最近公共祖先只是叫法不同。 Q:什么是最近公共祖先(LCA)? A:最近公共祖先的概念是很好理解的。首先,你需要脑补出一棵树(它可以是二叉树,也可以是多叉树。)之后,请你再在你脑补出的树上任取两个点。每个点都可以到达树根,且到达的路径是唯一的,既...

weixin_30614109的博客 158

LCA题目总结

好像LCA的题目并不多,现在就做了10道左右,但是找不到别的了,在此做个小总结,将来有更好的题目会不断更新 解决LCA问题,一般用3种方法 1.朴素方法:两个点都一直沿路径往上走,直到有某一个节点被经过两次并且是第一次出现这样的点,那么这个就是LCA 此方法最好理解,但是用得不多,但不代表没作用,有些题目还是需要用到的 2.LCA转RMQ(在线算法):一般是将LCA转为RMQ问题,用ST算

龙崎的专栏 809

poj 1986 Distance Queries

LCA 题意:LCA模板题,输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可 有人说要考虑不连通的情况,我没考虑AC了,另外可能有u,u这样的询问,不过这不影响,照样是写模板,没有特判,一样能过 还是Tarjan快一些 LCA转RMQ在线算法 #include <iostream>...

weixin_33730836的博客 85
上一篇: poj 1606 bfs(倒油)
下一篇: poj 2478/3090 欧拉函数应用(Farey 序列/斜率判重)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值