zoukankan      html  css  js  c++  java
  • hdu2066一个人的旅行(dijkstra)

    Problem Description
    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
     
    Input
    输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;
    接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
    接着的第T+1行有S个数,表示和草儿家相连的城市;
    接着的第T+2行有D个数,表示草儿想去地方。
     
    Output
    输出草儿能去某个喜欢的城市的最短时间。
     
    Sample Input
    6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10
     
    Sample Output
    9
    求出从不同的邻近城市出发到达某一个喜欢的城市的最短时间。
    #include<stdio.h>
    int map[1025][1025],s[1025],node[1025],like[1025],n,INF=100000000;
    void set(int n)
    {
        for(int i=1;i<=n;i++)
        {
            s[i]=0;node[i]=INF;
        }
    }
    int dijkstra(int m)
    {
        if(like[m])//当起点就在想要去的地方时,直接反回0
        return 0;
        
        int min,tm=m;
        s[m]=1;node[m]=0;
        for(int k=2;k<=n;k++)
        {
            min=INF;
            for(int i=1;i<=n;i++)
            if(s[i]==0)
            {
                if(node[i]>node[tm]+map[tm][i])
                node[i]=node[tm]+map[tm][i];
                if(min>node[i])
                {
                    min=node[i]; m=i;
                }
            }
            s[m]=1; tm=m;
            if(like[m])//当到达想要去的城市
            return node[m];
        }
    }
    int main()
    {
        int a,b,p,T,S,D,min,stra[1025];
        while(scanf("%d%d%d",&T,&S,&D)>0)
        {
            set(1020); n=-1; min=INF;//先初始化
            for(int i=1;i<=1020;i++)
            {
                like[i]=0;//0表示城市i不是喜欢要去的城市,反之
                for(int j=i+1;j<=1020;j++)
                map[i][j]=map[j][i]=INF;
            }
    
            while(T--)
            {
                scanf("%d%d%d",&a,&b,&p);
                if(map[a][b]>p) //重判
                map[a][b]=map[b][a]=p;
                if(n<a)n=a;//找到最大的城市
                if(n<b)n=b;
            }
            for(int i=1;i<=S;i++)//输入出发点
            scanf("%d",&stra[i]);
            while(D--)//输入要去的城市
            {
                scanf("%d",&a); like[a]=1;
            }
            min=dijkstra(stra[1]);//先以第一个作为出发点
            for(int i=2;i<=S;i++)//以后面的点作出发点,求出从不同的出发点到要去的城市中最少的用时
            {
                set(n);//初始化
                p=dijkstra(stra[i]);
                if(min>p)min=p;
            }
            printf("%d
    ",min);
        }
    }
    


  • 相关阅读:
    hive on spark:return code 30041 Failed to create Spark client for Spark session原因分析及解决方案探寻
    windows下大数据开发环境搭建(5)——Hive环境搭建
    kubernetes环境部署单节点redis
    kubernetes中有状态应用的优雅缩容
    欢迎关注我的知乎账号
    BCC和libbpf的转换
    BPF的可移植性和CO-RE (Compile Once – Run Everywhere)
    正则表达式
    正则表达式关键词解析
    正则表达式三种模式:贪婪模式、懒惰模式、独占模式
  • 原文地址:https://www.cnblogs.com/pangblog/p/3299548.html
Copyright © 2011-2022 走看看