How far away(DFS+vector存图)

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

题解:建立一个双向图,然后去深搜即可,注意存图要用vector并且每次用完注意清空vector存的内容

代码:

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

using namespace std;

struct node {
	int pos;
	int val;
} temp,q;

vector<struct node>a[40005];

int n,m,flag,e,vis[40005];

void DFS(int s,int ans) {
	int size,i;
	if(vis[s]) 
	return ;
	if(flag) 
	return ;
	if(s==e) {
		printf("%d
",ans);
		flag=1;
		return;
	}
	if(a[s].empty())  return ;
	else {
		vis[s]=1;
		size=a[s].size();
		for(i=0; i<size; i++)
			DFS(a[s][i].pos,ans+a[s][i].val);
		vis[s]=0;
	}
}
int main() {
	int cas;
	scanf("%d",&cas);
	while(cas--) {
		int i,j,x,y,z;
		scanf("%d %d",&n,&m);
		for(i=0; i<n-1; i++) {
			scanf("%d %d %d",&x,&y,&z);
			//建双向图 
			q.pos=y;
			q.val=z;
			a[x].push_back(q);
			q.pos=x;
			q.val=z;
			a[y].push_back(q);
			
		}
		for(j=0; j<m; j++) {
			memset(vis,0,sizeof(vis)); 
			flag=0;
			int s;
			scanf("%d %d",&s,&e);
			DFS(s,0);
		}
		//用完记得清空 
		for(i=0; i<n; i++) {
			a[i].clear();
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Staceyacm/p/10781889.html