How far away ?(DFS)

How far away ?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5766    Accepted Submission(s): 2166

Problem Description

There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to
answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path("simple" means you can‘t visit a place twice) between every two houses. Yout task is to answer all these curious people.

Input

First line is a single integer T(T<=10), indicating the number of test cases.

For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road
connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.

Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.

Output

For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.

Sample Input

2
3 2
1 2 10
3 1 15
1 2
2 3

2 2
1 2 100
1 2
2 1

Sample Output

10
25
100
100

Source

ECJTU 2009 Spring Contest

AC代码:

#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>

using namespace std;

const int M = 4 * 1e4 + 100;
typedef long long ll;
typedef pair<int,int> P;
vector<P>G[M];
int vis[M],isGO,e;

void dfs(int x, int cost)
{
    if(isGO || vis[x]) return ;
    if(x == e)//数据太大,要改成全局变量
    {
        isGO = 1;
        printf("%d\n",cost);
        return ;
    }
    vis[x] = 1;
    for(int i = 0; i < G[x].size(); i++)
    {
        P a = G[x][i];
        dfs(a.first,cost + a.second);
    }
    vis[x] = 0;
}

void solve()
{
    int x,y,c,n,m;
    scanf("%d %d",&n,&m);
    for(int i = 1; i < n; i++)
    {
        scanf("%d %d %d",&x,&y,&c);
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }
    while(m--)
    {
        isGO = 0;
        scanf("%d %d",&x,&e);
        dfs(x,0);
    }
    for(int i = 1; i <= n; i++) G[i].clear();
}

int main()
{
    int T,cnt = 0;
    scanf("%d",&T);
    while(T--)
    {
        solve();
    }
    return 0;
}
时间: 2024-10-04 18:11:45

How far away ?(DFS)的相关文章

HZOJ 20190727 T2 单(树上dp+乱搞?+乱推式子?+dfs?)

考试T2,考试时想到了40pts解法,即对于求b数组,随便瞎搞一下就oxxk,求a的话,很明显的高斯消元,但考试时不会打+没开double挂成10pts(我真sb),感觉考试策略还是不够成熟,而且感觉考试时间很不够用,一直在瞎yy+code,听讲题DeepinC 12min就打出了T150pts,这不仅是思维上的劣势,而且打代码的速度必须要加上来啊,不然就算有好想法也打不出来(也没啥好想法). 接下来就是正经八本的题解了: 首先我们可以来一波玄学复杂度分析,数据范围1e5,要么$O(nlogn)

Windows Server2016 安装及配置DFS实现数据复制

我们今天主要介绍的是Windows Server2016 安装及配置DFS实现数据复制,那什么是DFS呢?DFS就是Microsoft文件分布系统  是一个网络服务器组件,它能够使你更容易地在网络上查询和管理数据.分布式文件系统是将分布于不同电脑上的文件组合为单一的名称空间,并使得在网络上建立一个单一的.层次化多重文件服务器和服务器共享的工作更为方便的途径,使用户更加容易访问和管理物理上跨网络分布的文件.DFS为文件系统提供了单个访问点和一个逻辑树结构,通过DFS,用户在访问文件时不需要知道它们

[codevs 1961]躲避大龙(dfs)

题目:http://dev.codevs.cn/problem/1961/ 分析: 被“SPFA”的标签骗了…… 看了hzwer的博客才知道可以用f[i][0..60]表示每个点每个秒是否可以到.至于怎么弄出这个数组呢?dfs就行了....但注意走过的点还能再走,知道f[i][j]=1为止(因为这说明成了一个循环).时间复杂度的话最坏情况是每个点每个秒都能走到,即7000*60,完全可以……

[ZOJ 1008]Gnome Tetravex (dfs搜索 + 小优化)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1008 题目大意:给你n*n的矩阵,每个格子里有4个三角形,分别是上右下左,每个三角形里面标记了数字,问你能否通过移动这n*n个格子,使得相邻两个三角形具有相同的数字? dfs暴搜,dfs(x,y)代表当前要放(x,y)这个位置. 然后枚举给定的每个格子. 如果说可以放,就dfs下一个格子. 这一道题需要把相同的格子压缩起来,也就是说为了节省时间,可以记录相同的格

DFS序-树链剖序-欧拉序

,二叉树是一颗线段树,树状数组,树上的每个维护节点负责维护一个区间信息,节点之间又包含和属于的关系.例如线段树: DFS序: 我们通过对每个节点设置两个量,in和out.从根节点开始DFS搜索,in为第一次搜索到时的时间戳,out为退出出栈时的时间戳. 可以得到,例如我们要查询以b为根节点我们只需要查询区间[2,5]:要查询以c为根节点子树的信息,我们可以查询区间[6,7]:查询a需要查询区间[1,8].在程序中,当要查询修改时,我们可以用线段树去维护,因为这些序列的性质和线段树太像了.我们要注

PAT Advanced 1034 Head of a Gang (30) [图的遍历,BFS,DFS,并查集]

题目 One way that the police finds the head of a gang is to check people's phone calls. If there is a phone call between A and B, we say that A and B is related. The weight of a relation is defined to be the total time length of all the phone calls mad

图算法系列-深度优先搜索与广度优先搜索

2.深度优先搜索 为了访问一个顶点,我们将它标记为已经访问过,然后递归的访问所有与子邻接的并且尚未标记的顶点,这就是深度优先搜索(DFS),DFS常用于解决路径问题. 比如下面的连通图,我们从顶点0开始对图进行探索 下面这个图显示了DFS处理时的递归调用树. DFS可以解决的问题:1)环检测:一个图中有环吗?该图是森林吗?2)简单路径:给定两个顶点,是否存在一条连接他们的路径3)简单连通性:无论何时使用DFS,都可以在线性时间内确定一个图是否连通4)顶点搜索:在给定顶点所在的同一个连通分量中有多

2017清北学堂集训笔记——动态规划Part2

啊~到下午啦,我们进入Part2!--一个简洁的开头 我们来探讨第一类问题--路径行走问题 经典例题:方格取数(Luogu 1004) 设有 N*N 的方格图 (N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0.* 某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 0).* 此人从 A 点到 B 点共走两次,试找出 2 条这样的路径,使得取得的数之和为最大.- 与数字金字塔

SHTSC2017酱油记

考完回来累成狗..睡了一觉..补游记.. DAY0 把最近刷的题发了下题解..NOIP RK10的蒟蒻收拾收拾准备退役了.. 12点就睡了..很久周五没这么早睡了.. DAY1 9点就醒了..莫名紧张.. 进考场昏昏沉沉的..感觉药丸.. 首先看了一眼T1..怎么没读懂题意..然后再看了两眼..感觉好像很难的样子 算了先看T2..哇数据结构吗..激动的读完题..好像是数论+数据结构..有点小绝望 然后T3..看到组合数..想到了去年跪在数论题上的阴影.. 先搞T2吧..丢了一颗线段树上去..拿到