• 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
    ",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;
    }
    
    


  • 相关阅读:
    EAX、ECX、EDX、EBX寄存器的作用
    MFC VS2005 添加Override 和 Message
    ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]
    两种应该掌握的排序方法--------2.quick Sort
    关于I/O的那点事
    整理一下 编码、解码库
    VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》
    golang安装卸载 linux+windows+raspberryPI 平台
    (转)如何正确使用C++多重继承
    单播、多播(也称组播)、广播
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5392296.html
Copyright © 2020-2023  润新知