• 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
    ",dist);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    js函数与DOM
    js流程控制语句与数组
    js基础语法与表达式
    CSS
    注解使用IDEA的Filter注解模板
    JSP小结
    JSP的九大内置对象
    Mac上Sublime常用快捷键
    git cherry-pick: failed to refresh the index
    c++11之后类中定义常量的最好方法
  • 原文地址:https://www.cnblogs.com/alan-W/p/5755339.html
Copyright © 2020-2023  润新知