• 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;
    }
    
  • 相关阅读:
    zabbix(x)
    kvm 学习(三)存储池
    kvm 学习(二)镜像
    hadoop3.1.1:找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
    (转)mysql更改数据目录
    (转)SLOW READPROCESSOR;ERROR SLOW BLOCKRECEIVER错误日志分析
    Linux下 为什么有时候使用sudo也提示没有权限
    (转)hadoop 常规错误问题(一)
    (转)SmartPing:一个服务器Ping值监测工具
    (转)hadoop 配置文件解释
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781888.html
Copyright © 2020-2023  润新知