hdu2586 step5.3.4.cpp How far away ?

How far away ?                  

 

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

Total Submission(s): 3917    Accepted Submission(s): 1492

 

 

Problem Description

There are n houses in the village and somebidirectional roads connecting them. Every day peole always like to ask likethis "How far is it if I want to go from house A to house B"? Usuallyit 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 simplepath("simple" means you can't visit a place twice) between every twohouses. 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.

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

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

 

 

Output

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

 

 

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

 

 

Recommend

lcy  |   We have carefully selectedseveral similar problems for you:  34862874 2888 3234 2818

题解:

神奇的题目 ,居然用dfs就能过。用g++能够用,用c++不能过。

源代码:

#include <iostream>

#include <stdio.h>

#include <string>

#include <string.h>

#include <vector>

#define MAX 40050

 

using namespace std;

 

struct node

{

   intc,v;

};

vector<node> vil[MAX];

bool used[MAX];

bool flag;

 

void dfs(int cur,int tar,int ans)

{

   if(cur== tar)

   {

     printf("%d\n",ans);

     flag = true;

     return;

   }

   if(vil[cur].empty())

     return;

 

   for(int i = 0;i < vil[cur].size();i++)

   {

     if(used[vil[cur][i].c])

        continue;

     used[vil[cur][i].c] = true;

     dfs(vil[cur][i].c,tar,ans+vil[cur][i].v);

     if(flag)

        return;

   }

}

int main()

{

   intt,n,m;

 

   scanf("%d",&t);

   inta,b,c;

   node road;

   for(int x = 0; x < t;x++)

   {

     scanf("%d%d",&n,&m);

     for(int  y = 0;y< n-1;y++)

     {

        scanf("%d%d%d",&a,&b,&c);

        road.c = b;

        road.v = c;

        vil[a].push_back(road);

        road.c = a;

        vil[b].push_back(road);

     }

     for(int y = 0;y < m;y++)

     {

        flag = false;

        memset(used,false,sizeof(used));

        scanf("%d%d",&a,&b);

        used[a] = true;

        dfs(a,b,0);

     }

     for(int y = 0;y < n;y++)

        vil[y].clear();

   }

   return0;

}

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值