hdu 2874 Connections between cities LCA || dfs+并查集

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势 本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领 阅读详情

题意: 

给出一些树:有n(10000), m条边(10000), c(1000000)个询问,每个询问a b要求找到a到b的最短距离,如果ab不在同一棵树,输出-1.

题解:

此题就是找两个节点的最近公共祖先,则两者的距离就是a和b到根节点的距离之和 - 2倍公共祖先到根节点的距离。可用离线的LCA算法,其实就是dfs+并查集,下面分析一下离线的LCA, 我是看了原理后,自己敲出的代码。

LCA:

离线的LCA,其实就是说,只用一次dfs遍历所有的节点,就可以找出任意两个节点的距离,但是问题是,由于节点太多,无法保存任意两个节点的距离,所以在具体应用中,需要先保存询问,然后在dfs的过程中,只需要保存询问的节点的答案即可。LCA: 其实就是先序遍历这棵树,然后当访问完一个节点后,就把这个节点和他的父节点用并查集并到一起,那么当访问到要询问的节点U后,只需要判断询问边的另一个节点V是否被访问过了,如果被访问过了,则V的父节点就是两者的最近公共祖先。

细节:

在本题中,可能不止一颗树,所以在处理过程中,可以增加一个虚拟的0节点,作为所有节点的根节点,这样,如果访问节点的父节点是0节点,就代表这两个节点不属于同一棵树,则他们应该输出-1.

代码:

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 1e4 + 10;
int n, m, c, fa[maxn], ans[1000000+10], vis[maxn], dist[maxn];
struct Node{
    int v, d;
    Node(int v = 0, int d = 0) : v(v), d(d){}
};
vector<Node> G[maxn];
vector<Node> query[maxn];

int findSet(int x)
{
    if (x != fa[x]) {
        fa[x] = findSet(fa[x]);
    }
    return fa[x];
}
void init()
{
    for (int i = 0; i <= n; i++)
    {
        fa[i] = i;
        dist[i] = 0;
        vis[i] = 0;
        G[i].clear();
        query[i].clear();
    }
    for (int i = 0; i < m; i++)
    {
        int u, v, d; scanf("%d%d%d", &u, &v, &d);
        G[u].push_back(Node(v, d));
        G[v].push_back(Node(u, d));
        int fu = findSet(u), fv = findSet(v);
        if (fu != fv) {
            fa[fu] = fv;
        }
    }
    for (int i = 1; i <= n; i++) {
        int fi = findSet(i);
        if (fa[fi] == i) {
            G[0].push_back(Node(i, 0));
        }
    }
    for (int i = 0; i <= n; i++) {
        fa[i] = i;
    }
    for (int i = 0; i < c; i++) {
        int u, v; scanf("%d%d", &u, &v);
        ans[i] = -1;
        query[u].push_back(Node(v, i));
        query[v].push_back(Node(u, i));
    }
}
void print()
{
    for (int i = 0; i < c; i++) {
        if (ans[i] != -1) {
            printf("%d\n", ans[i]);
        }
        else printf("Not connected\n");
    }
}
void dfs(int u)
{
    vis[u] = 1;
    for (int i = 0; i < query[u].size(); i++)
    {
        int fv = findSet(query[u][i].v);
        if (vis[query[u][i].v] && fa[fv] != 0)
        {
            ans[query[u][i].d] = dist[query[u][i].v] + dist[u] - 2*dist[fa[fv]];
        }
    }
    for (int i = 0; i < G[u].size(); i++)
    {
        if (vis[G[u][i].v]) continue;
        
        dist[G[u][i].v] = dist[u] + G[u][i].d;
        dfs(G[u][i].v);
        int fv = findSet(G[u][i].v);
        int fu = findSet(u);
        fa[fv] = fa[fu];
    }
}
int main()
{
//    freopen("/Users/apple/Desktop/in.txt", "r", stdin);
    while (scanf("%d%d%d", &n, &m, &c) != EOF)
    {
        init();
        dfs(0);
        print();
    }
    
    return 0;
}

华为OD机试 - 整型数组按照个位数排序(Python/JS/C/C++ 双机位C卷 100分) 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素,相对位置保持不变。当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。给定一个非空数组,其元素数据类型为32位有 阅读详情

相关推荐

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1523

HDU - 2874 Connections between cities (LCA)

HDU - 2874 题目 思路:求叶子节点间距离,tarjan求lca,然后由u->v的距离就是 d[u] + d[v] - 2 * d[lca(u,v)]; #include #include #include #include using namespace std; const int maxn = 1e5; const int maxq = 1e6+50; struct

shinimashzi 360

MAX31855电路和程序,实现SPI和软件模拟时序两种方式读取数据

1. 概述 MAX31855为热电偶至数字输出转换器,内置14位模/数转换器(ADC)。器件带有冷端补偿检测和修正、数字控制器、SPI兼容接口,以及相关的控制逻辑,在温度控制器、过程控制或监测系统中设计用于配合外部微控制器(μC)工作。提供多个版本的器件,每个版本针对特定的热电偶类型(K、J、N、T或E型)进行优化和调整。热电偶类型以器件型号后缀表示(例如MAX31855K)。 器件输出14位...

睿思派克 1万+

HDU-2874 Connections between cities(倍增法)

Connectionsbetween cities Time Limit: 10000/5000 MS(Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12422    Accepted Submission(s): 2875 Problem Description Aft

Yuki_fx的博客 798

R以及Rstudio超详细安装教程(包括安装过程中出现的问题)

R安装及Rstudio安装,以及安装中出现的问题

2301_76908257的博客 1万+

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 799

HDU 2874 —— Connections between cities(并查集+LCA)

题目:Connections between cities 题意:N个点

hongrock的专栏 702

事件相机数据处理实战:从原始事件流到视觉表征的三种核心方法

本文深入探讨了事件相机数据处理的核心环节,即如何将异步、稀疏的原始事件流转换为深度学习模型可处理的视觉表征。文章重点解析了三种核心方法:逐通道累积、体素网格双线性插值和对称累积事件表示,详细阐述了其原理、代码实现、可视化效果及各自的适用场景,为事件相机在目标识别、光流估计等视觉任务中的高效应用提供了实战指南。

read5的博客 438

HDU2874——Connections between cities 详解 (LCA,RMQ,数据结构,dfs序,并查集)

Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9013    Accepted Submission(s): 2178 Problem Description

say_c_box的博客 1835

openEuler 欧拉 安装Oracle19c数据库RPM包安装

欧拉系统安装部署oracle 19c rpm方式

陈苏漾的IT生涯 6891

基于GA-BP遗传算法优化神经网络的多输入多输出数据预测-Python代码实现

多输入多输出的GA-BP神经网络

2301_80449389的博客 2306

无界扰动下线性演化方程的适定性:Yosida距离与指数二分性保持

在动力系统与偏微分方程研究中,线性演化方程是描述热传导、波动等物理过程的核心模型。其适定性(解的存在、唯一及连续依赖性)是进行理论分析与数值模拟的基础。算子半群理论为自治系统提供了优美的适定性框架,但当系统受到非自治且无界的扰动时,经典扰动理论失效。此时,Yosida距离作为一种度量无界算子“接近程度”的工具,通过预解式估计来刻画扰动的“微小性”。这种基于预解式的估计,允许扰动算子本身无界,但要求其与主算子预解式的复合效应可控制。从技术价值看,这为处理一大类含有时变奇异系数的物理模型(如反应-扩散方程)提供

weixin_30905133的博客 391

【我的Android进阶之旅】解决android应用使用android:persistent属性带来的系统Launcher应用必须重启设备才生效的问题,大幅度提升开发效率

一、问题描述 我们在开发系统级别应用,比如Launcher桌面的时候,会发现有个问题:每次Launcher修改完代码,重新编译之后,安装到android设备上之后,必须重启才会生效。否则就是使用了之前的Launcher版本的内容。而每次重启设备得一分钟左右,太慢了,太影响效率了! 1.1 痛点 每次更新完代码,重新安装之后,必须重启设备才会生效。效率太TM低了! 二、分析问题 经过一轮代码排查,最终发现是因为src\main\AndroidManifest.xml文件中,定义application使用了an

字节卷动 1711

【HDU 2874 Connections between cities】 LCA

HDU2874 题意 就是给你一个图 没有环 可能联通 可能不联通 问你两个点直接距离 如果不在一个块内输出 “Not connected” 否则输出距离 做法 我们用并查集确定联通快 这样如果两个点在一个块内 那么就输出 dis[a] + dis[b] - 2*dis[LCA(a,b)] 如果不在一个块内 输出 “Not connected” /* if you can't see th...

我是谁 --- 卡比兽 170

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HDU - 2874 Connections between cities(并查集+LCA)

题目链接:点击查看 题目大意:给出n个点代表城市,再给出m条边将其连接,每条边都有边权,题目保证给出的图无环,现在给出两个点,首先询问两个点是否互相连通,若可以连通,询问两点之间的距离 题目分析:判断连通我们直接用并查集维护分块就好了,因为是无向图,所以最后对于每个分块随便选一个点当做根节点跑一遍dfs维护一下树上前缀和,最后就可以直接判断了,算是一个模板题吧,比较简单 代码: #inc...

Falcon的博客 580

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU 2874 Connections between cities(LCA离线算法)

该题用离线算法的时候要注意会MLE, 内存卡的很紧, 所以要想办法优化内存, 利用存储边的数组就行了。  LCA是利用了并查集在树上进行的操作, 由于该题可能不形成一棵树,所以要对所有子树进行LCA。 然后不在一个集合中的两个点不能联通。 细节参见代码: #include #include #include using namespace std; typedef long long ll;

AC_Arthur的专栏 1056

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HDU 2874 Connections between cities (并查集+lca倍增法)

题意:由于战争期间大部分道路已被完全摧毁,两个城市之间可能没有路径,也没有环存在。现在,告诉您道路状况后,我们想知道任何两个城市之间是否存在路径。如果答案是肯定的,则输出它们之间的最短路径。 题解:并查集+lca倍增法 先用并查集缩点,不在同一集合必然不存在路径,然后dfs预处理每一个集合。 这里用倍增法求lca。 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstdio> #include<strin

gongyuandaye的博客 335

HDU - 2874 Connections between cities (并查集)判断是否存在LCA

HDU - 2874 Connections between cities 题意: 有n个点,m条带权无向边,q条询问。对每次询问判断两点是否存在LCA,存在输出最短距离,否则输出Not connected 。 思路: 用并查集判断是否存在LCA (x,y)距离公式:dis[x] + dis[y] - 2*dis[lca(x,y)] #include<iostrea...

没有梦想何以远行 211

HDU 2874 Connections between cities (树上倍增 LCA + 并查集 )

Connections between cities: 题解: 树上倍增LCA处理最近公共祖先,并查集处理不同集合的树,递推距离,但是有一个坑点,这题卡常,卡的要命,所以在处理一个集合的树的时候,需要剪枝,访问过的点,就不需要再访问了,但是一般建树的dfs,访问过的点,可能还会访问一两次。 AC代码: #include<bits/stdc++.h> using namespace ...

yangzijiangac的博客 300

HDU 2874 Connections between cities [LCA]

题目给出的图不一定连通,可以虚拟一个根节点。查询时,若LCA(u, v)为根节点,则表示u,v不相连;否则,求出最短距离。#include #include #include #include #include #include using namespace std; const int maxn = 10010; int n, m, c, cnt; int e[maxn<<1]

~飞呀,飞~ 618

hdu2874 Connections between cities(LCA离线+并查集)

http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意:给你一个无向森林图,求任意两点距离,若不能连通,输出Not..,若连通,输出距离。查询数据量大。 思路:求距离思路和hdu2586一样,只不过这里转变为森林。这样要想判断不在一个树上,只能用并查集,把树上的点圈成一个集合,判断前再通过判断老大来确定输出方式。既然加了并查集就加了相关的

Iguodala的博客 458

hdu2874—Connections between cities(LCA)

题目大意:给出n个城市,m条路,不存在环,求任意两个城市间的距离,城市间可能不联通 解题思路:ST+并查集, 并查集判断城市间是否联通,因为给出的可能是森林,将每颗树的根节点指向一个root,构成一棵树。 #include #include #include #include #include #include #include #include

zhiyuanjiang的博客 364

HDU2874(Connections between cities)

Connections between cities 题目传送门 Problem Description After World War X, a lot of cities have been seriously damaged, and we need to rebuild those cities. However, some materials needed can only be produced in certain places. So we need to transport these .

weixin_43808717的博客 264

hdu 2874 Connections between cities (lca在线询问)

题目链接 思路: 第一次做多颗树合用一个lca,记录一下,其实就是一开始init,在加边的时候做一下并查集,把一棵树上的点都算到一个集合去,然后遍历1到n,如果fa[i] == i的话就搞一下lca,这里多颗树是共用一个欧拉序的,但不影响此模板的正确性,因为记录第一次数显的位置的都是正确的。 初始化 -> lca+st表 -> 在线询问。 数据有点水把,最极限情况1e10应该要开lon...

qq_43555854的博客 236

【HDU 2874】Connections between cities(LCA)

dfs找出所有节点所在树及到树根的距离及深度及父亲。 i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2。 #include <cstring> #include <cstdio> #define N 10005 #define add(u,v,w) e[++cnt]=(edge){v,head[u],w};hea...

dingguayi7025的博客 171

hdu2874 Connections between cities

H - Connections between cities Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 2874 Description After World War X, a lot of cities have been ser

Kblacksmith的博客 538
上一篇: hdu 3648 Median Filter 树状数组+二分查找+优化
下一篇: uva 12730 Skyrk's Bar 递推
吃掉吃掉
博客等级 码龄12年 7粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值