HDU2586 How far away ? 邻接表+DFS

题目大意:n个房子,m次询问。接下来给出n-1行数据,每行数据有u,v,w三个数,代表u到v的距离为w(双向),值得注意的是所修建的道路不会经过一座房子超过一次。m次询问,每次询问给出u,v求u,v之间的最短路。

题目思路:开始以为是最短路,但仔细分析后发现无论是SPFA还是其他最短路算法时间都会超限。因为所修的路不会经过一座房子两次,所以想到了DFS搜一下,这样时间复杂度为O(N),用邻接矩阵存图会爆内存,所以用邻接表存图。

 

#include<stdio.h>
#include<string.h>
#include<cstring>
#include<string>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#define INF 0x3f3f3f3f
#define MAX 1000005

using namespace std;

struct node
{
    int u,v,w,next;
} Map[MAX];

int n,m,k,a[MAX],s,e,vis[MAX],dist,ok;
void Add(int u,int v,int w)
{
    Map[k].u=u;
    Map[k].v=v;
    Map[k].w=w;
    Map[k].next=a[u];
    a[u]=k++;
}

void DFS(int step,int ans)
{
    if(step==e && !ok)
    {
        ok=1;
        dist=ans;
        return;
    }
    for(int i=a[step]; i!=-1; i=Map[i].next)
    {
        int v=Map[i].v;
        if(!vis[v])
        {
            vis[v]=1;
            DFS(v,ans+Map[i].w);
        }
        if(ok)
            return;
    }
}

int main()
{
    int T,i,j,u,v,w;
    scanf("%d",&T);
    while(T--)
    {
        for(i=0;i<MAX;i++)
            a[i]=-1;
        k=0;
        scanf("%d%d",&n,&m);
        for(i=1; i<n; i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            Add(u,v,w);
            Add(v,u,w);
        }

        for(i=1; i<=m; i++)
        {
            ok=0;
            memset(vis,0,sizeof(vis));
            scanf("%d%d",&u,&v);
            vis[u]=1;
            s=u;
            e=v;
            DFS(u,0);
            printf("%d\n",dist);
        }
    }
    return 0;
}
View Code

 

posted @ 2016-08-10 08:58  声声醉如兰  阅读(186)  评论(0编辑  收藏  举报