首页 > 其他分享 >hdu2586 How far away ?--tarjan & LCA

hdu2586 How far away ?--tarjan & LCA

时间:2022-12-06 19:33:04浏览次数:93  
标签:tarjan far away cnt int edge 40005 include head


原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=2586​


题意:n个点,编号1-n,接下来n-1行,每行三个数字表示两点之间的距离,题目是保证两点间不会出现两条可行的路,也就是不会有环;m条询问,每条询问两个数字a,b表示a,b的最短距离。


#define _CRT_SECURE_NO_DEPRECATE 

#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<cmath>
#define INF 99999999
#define eps 0.0001
using namespace std;

struct Edge
{
int w;
int v;
int next;
};

int t;
int n, m;
int cnt;
Edge edge[40005 * 2];
int head[40005];
int x[40005];
int y[40005];
int z[40005];
int pre[40005];
int dist[40005];
bool vis[40005];

void add(int u, int v, int w)
{
edge[cnt].w = w; edge[cnt].v = v; edge[cnt].next = head[u]; head[u] = cnt++;
edge[cnt].w = w; edge[cnt].v = u; edge[cnt].next = head[v]; head[v] = cnt++;
}

int find(int x)
{
if (pre[x] != x)
return pre[x] = find(pre[x]);
return x;
}

void tarjan(int u)
{
vis[u] = 1;
pre[u] = u;

for (int i = 0; i < m; i++)
{
if (x[i] == u&&vis[y[i]]) z[i] = find(y[i]);
if (y[i] == u&&vis[x[i]]) z[i] = find(x[i]);
}

for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if (!vis[v])
{
dist[v] = dist[u] + edge[i].w;
tarjan(v);
pre[v] = u;
}
}
}

int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);

int u, v, w;
cnt = 0;
memset(head, -1, sizeof(head));
for (int i = 1; i < n; i++)
{
scanf("%d%d%d", &u, &v, &w);
add(u, v, w);
}

for (int i = 0; i < m; i++)
{
scanf("%d%d", &u, &v);
x[i] = u;
y[i] = v;
}

memset(vis, 0, sizeof(vis));
dist[1] = 0;
tarjan(1);

for (int i = 0; i < m; i++)
printf("%d\n", dist[x[i]] + dist[y[i]] - 2 * dist[z[i]]);
}

return 0;
}





标签:tarjan,far,away,cnt,int,edge,40005,include,head
From: https://blog.51cto.com/u_11937443/5916567

相关文章

  • 基于13位巴克码和线性调频混合调制信号MTI,MTD以及CFAR的matlab仿真
    up目录一、理论基础二、核心程序三、测试结果一、理论基础巴克码序列是相位编码信号的一种,具有理想的自相关特性。巴克码的自相关函数的主峰和旁瓣均为底边宽度为2T......
  • 卡片游戏(Throwing cards away I)
    ProblemB:ThrowingcardsawayIGivenisanordereddeckofncardsnumbered1tonwithcard1atthetopandcardnatthebottom.Thefollowingoperationi......
  • tarjan算法
    \(tarjan\)RobertTarjan,计算机科学家,以LCA、强连通分量等算法闻名,同时他还参与了开发斐波那契堆、伸展树的工作。\(Tarjan\)算法是基于深度优先搜索的算法,用于求解图的......
  • 【模板】Tarjan
    postedon2022-07-0720:52:49|under模板|source0x00有向图缩点现有一有向图\(G=(V,E)\),称一个点集\(E'\inE\)为强连通分量,当且仅当\(E'\)的任意两点可以互......
  • GAN生成图像,数据集CIFAR-10
    实验结果:Epochindex:14,15epochesintotal.Batchindex:400,thebatchsizeis64.Discriminatorlossis:0.9480361938476562,generatorlossis:1.13437151......
  • MIFARE Plus-X和MIFARE Plus-S的区别
    MIFAREPlus-X和MIFAREPlus-S的区别mingdu.zhengatgmaildotcomMIFAREPlus-X和MIFAREPlus-S的特性特性MIFAREPlus-XMIFAREPlus-SSL2支持不支持SL3值操作支持不支持S......
  • 真离谱!谁说安卓浏览器难用,不如Safari浏览器?
    我们使用手机上网经常需要使用浏览器。最近有朋友吐槽说,安卓浏览器真难用,不如Safari那么好用。但是,Safari只能在苹果手机上使用啊,这么多国人使用安卓手机,难道为了用Safari......
  • Tarjan算法求强连通分量
    \(Tarjan\)——强连通分量首先了解几个概念:强连通,强连通图,强连通分量强连通:在一个有向图\(G\)中,两个点\(a,b\),\(a\)可以走到\(b\),\(b\)可以走到\(a\),我们就说\((a,b)\)......
  • LCA 之 Tarjan(离线)算法
    \(LCA\)之\(Tarjan\)(离线)算法什么是最近公共祖先?在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先......
  • Tarjan算法
    tarjan求无向图割点,若x是根节点,则子树个数>1时x时割点;若x是非根节点,当ipt[x]<=low[y]时x是割点,说明y的子树无法通过非父子边回溯到x的祖先,那么删掉x,图将分裂成两个字图,即x......