D - How far away ?

  题目:

 

 题目网址:Problem - 2586 (hdu.edu.cn)

  思路:

一个村庄有n个房子,要求m次i,j距离;

首先把路都存储在栈组里,

在对每一次输入的i,j进行dfs搜索累加路径距离输出结果;

  代码实现:

#include<stdio.h>
#include<vector>
#include<string.h>
#include<iostream>
using namespace std;
struct bian//存储道路通行那以及长度
{
    int pos;
    int val;
}q;
const int maxn=40005;
vector<struct bian>a[maxn];
int n,m,flag,e,vis[maxn];
void DFS(int s,int ans)
{
    int size,i;
    if(vis[s]) return ;//防止重复
    if(flag) return ;//输出答案后退出
    if(s==e)//如果到该节点,输出结果,标记已输出
    {
        cout<<ans<<endl;
        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 t;
    cin>>t;
    while(t--)
    {
        int i,j,x,y,z;
        cin>>n>>m;
        for(i=0;i<n-1;i++)
        {
                cin>>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;
            cin>>s>>e;
            DFS(s,0);
        }
        for(i=0;i<n;i++)
        {
            a[i].clear();//对栈组进行清零
        }
    }
      return 0;
}

 

posted @ 2021-07-23 15:36  wateriness  阅读(42)  评论(0)    收藏  举报