• 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;
    }
    
  • 相关阅读:
    Spring框架总结(二)
    java.lang.ClassCastException: com.liuyang.annocation.UserAction cannot be cast to com.liuyang.annocation2.UserAction at com.liuyang.annocation2.App.test
    Spring框架总结(一)
    Error creating bean with name 'us' defined in class path resource [com/liuyang/test/DI/beans2.xml]: Cannot resolve reference to bean 'daoa' while setting bean property 'daoa'; nested exception is org.
    互联网系统架构的演进
    重新理解:ASP.NET 异步编程(转)
    Git初级使用教程(转)
    JavaScript开发规范要求
    大型网站架构演化发展历程(转)
    Bootstrap 学习(1)
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781888.html
Copyright © 2020-2023  润新知