传送门:http://abc070.contest.atcoder.jp/tasks/abc070_d

本题是一个图论问题——树(Tree)。

有一棵结点数目为n的无向树。第i条边连接结点aibi,权值为ci。给出q次查询,以及一个整数k(1≤k≤n),第j次查询给出两个整数xj,yj(1≤xj,yj≤n),求解结点xjyj通过结点k的最短路径长度。

树上的路径问题,可以通过DFS解决。以下代码片段计算结点间的路径长度dis

void dfs(int v)
{
vis[v] = true;
for (int i = ; i < adj[v].size(); i++) {
int u = adj[v][i].v;
int w = adj[v][i].w;
if (!vis[u]) {
dis[u] = dis[v] + w;
dfs(u);
}
}
}

结点xy通过结点k的最短路径可以分成两部分:结点kx的最短路径和结点ky的最短路径。如此,通过一个简单的DFS,求解结点ki(1≤i≤n)的路径长度dis[i]。则查询的返回值为dis[x]+dis[y]。参考程序如下:

#include <bits/stdc++.h>
using namespace std; #define MAX_N 100001 vector<pair<int, int> > adj[MAX_N];
int64_t dis[MAX_N];
bool vis[MAX_N]; void dfs(int v)
{
vis[v] = true;
for (int i = ; i < adj[v].size(); i++) {
int u = adj[v][i].first;
int w = adj[v][i].second;
if (!vis[u]) {
dis[u] = dis[v] + w;
dfs(u);
}
}
} int main(void)
{
int n, k, q;
scanf("%d", &n);
for (int i = ; i < n; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
adj[a].push_back(make_pair(b, c));
adj[b].push_back(make_pair(a, c));
}
scanf("%d%d", &q, &k);
dfs(k);
while (q--) {
int x, y;
scanf("%d%d", &x, &y);
printf("%lld\n", dis[x] + dis[y]);
}
return ;
}

AtCoder ABC 070D - Transit Tree Path的更多相关文章

  1. HUSTOJ:Transit Tree Path

    问题 D: Transit Tree Path   You are given a tree with N vertices.Here, a tree is a kind of graph, and ...

  2. Atcoder Beginner Contest 070 D - Transit Tree Path

    题意:n个点,n-1条边,组成一个无向的联通图,然后给出q和k,q次询问,每次给出两个点,问这两个点之间的最短距离但必须经过k点. 思路:我当时是用优化的Dijkstra写的(当天刚学的),求出k点到 ...

  3. 2018.7中石油个人赛第4场(D-Transit Tree Path)-最短路算法

    6690: Transit Tree Path 时间限制: 1 Sec  内存限制: 128 MB提交: 472  解决: 132[提交] [状态] [讨论版] [命题人:admin] 题目描述 Yo ...

  4. Atcoder ABC 070 B、C、D

    B - Two Switches Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice ...

  5. atcoder abc 244

    atcoder abc 244 D - swap hats 给定两个 R,G,B 的排列 进行刚好 \(10^{18}\) 次操作,每一次选择两个交换 问最后能否相同 刚好 \(10^{18}\) 次 ...

  6. Lintcode376-Binary Tree Path Sum-Easy

    376. Binary Tree Path Sum Given a binary tree, find all paths that sum of the nodes in the path equa ...

  7. [atcoder contest 010] F - Tree Game

    [atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...

  8. ATCODER ABC 099

    ATCODER ABC 099 记录一下自己第一场AK的比赛吧...虽然还是被各种踩... 只能说ABC确实是比较容易. A 题目大意 给你一个数(1~1999),让你判断它是不是大于999. Sol ...

  9. 【启发式搜索】Codechef March Cook-Off 2018. Maximum Tree Path

    有点像计蒜之道里的 京东的物流路径 题目描述 给定一棵 N 个节点的树,每个节点有一个正整数权值.记节点 i 的权值为 Ai.考虑节点 u 和 v 之间的一条简单路径,记 dist(u, v) 为其长 ...

随机推荐

  1. 关于isset的一点说明

    作者:zhanhailiang 日期:2014-10-08 今天遇到一个非常奇怪的bug,測试例如以下: <? php $a = 'abc'; var_dump(isset($a['code'] ...

  2. vijos P1459车展

    P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park     描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...

  3. 使用SetTimer函数为Delphi的Win控件设置时钟

    procedure Timertodo(var messag:Tmessage);message WM_TIMER; procedure TForm1.FormCreate(Sender: TObje ...

  4. u-boot的内存分布和全局数据结构

    U-boot,除非在RAM中调试,一般情况下都是从flash中执行一段代码,然后将flash中储存的代码和数据搬移到ram中,然后跳转到ram中执行.当然这应该也是一般的bootloader的执行方式 ...

  5. @Transaction 无效

    上班的时候碰到这个问题,看了一些博客写的,都试了一遍解决方案,发现结果还是不行, 最后突然发现我的配置顺序和网上的有些许不同,就改了下,发现成功了,特此打桩纪念一下. 一.先说一下基本用法: 1. @ ...

  6. 使用poi读取word2007(.docx)中的复杂表格

    使用poi读取word2007(.docx)中的复杂表格 最近工作需要做一个读取word(.docx)中的表格,并以html形式输出.经过上网查询,使用了poi. 对于2007及之后的word文档,需 ...

  7. nyoj--496--巡回赛(拓扑排序)

    巡回赛 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军,尤其是重量级,几乎造就了大家耳熟能详的所 ...

  8. Pet(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=4707 题意:判断距离大于D的点有多少个. 思路: 邻接表建图,dfs每一个点,记录步数. #include &l ...

  9. 迭代,IDA*

    1.codevs1288 题意:对于一个分数a/b(a!=1),将它表示为1/x + 1/y + 1/z ……的形式,x,y,z……互不相同 多解取加数少的,加数相同时,取最小的分数最大的. 思路:经 ...

  10. ASP.NET Core 多环境

    ASP.NET Core 支持在多个环境中管理应用程序,如开发(Development),预演(Staging)和生产(Production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当 ...