zoukankan      html  css  js  c++  java
  • HDU2066(SPFA+前向星)

    https://vjudge.net/problem/HDU-2066

    虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^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
     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<vector>
     7 #include<queue>
     8 #define ms(x,n) memset(x,n,sizeof x);
     9 const int maxn=2010;//1010
    10 const int inf=0x3f3f3f3f;
    11 using namespace std;
    12 int n,m,cnt;
    13 int head[maxn],vis[maxn],d[maxn];
    14 struct edge
    15 {
    16     int to,w,next;
    17     edge(){}
    18     edge(int tt,int ww,int ne){to=tt,w=ww,next=ne;}
    19 }e[maxn];
    20 void add(int u,int v,int w)
    21 {//注意输入的是无向图;
    22     e[cnt]=edge(v,w,head[u]);
    23     head[u]=cnt++;
    24     e[cnt]=edge(u,w,head[v]);
    25     head[v]=cnt++;
    26 }
    27 int spfa(int s,int n)//起始点,终点
    28 {
    29     int u,v;
    30     queue<int>q;
    31     memset(vis,0,sizeof vis);
    32     memset(d,0x3f,sizeof d);
    33     while(!q.empty())q.pop();
    34     d[s]=0,vis[s]=1;
    35     q.push(s);
    36     while(!q.empty())
    37     {
    38         u=q.front();
    39         q.pop();
    40         vis[u]=0;
    41         for(int i=head[u];~i;i=e[i].next)
    42         {
    43             v=e[i].to;
    44             if(d[v]>d[u]+e[i].w)
    45             {
    46                 d[v]=d[u]+e[i].w;
    47                 if(!vis[i])
    48                 {
    49                     vis[v]=1;
    50                     q.push(v);
    51                 }
    52             }
    53         }
    54     }
    55     return d[n];
    56 }
    57 int main()
    58 {
    59 int t,s,d;
    60 while(~scanf("%d%d%d",&t,&s,&d))
    61 {
    62     memset(head,-1,sizeof head);
    63     cnt=0;
    64     for(int i=1;i<=t;i++)
    65     {
    66         int x,y,w;
    67         scanf("%d%d%d",&x,&y,&w);
    68         add(x,y,w);
    69     }
    70     int m[maxn];//相邻城市
    71     for(int i=1;i<=s;i++)
    72         scanf("%d",&m[i]);
    73     int ans=inf;
    74     for(int i=1;i<=d;i++)
    75     {
    76         int want;//想去城市
    77         scanf("%d",&want);
    78         for(int j=1;j<=s;j++)
    79             ans=min(ans,spfa(m[j],want));//注意下标
    80     }
    81     printf("%d
    ",ans);
    82 }
    83 return 0;
    84 }
  • 相关阅读:
    简单实现vue列表点击某个高亮显示
    vue中子组件直接修改父组件prop属性bug
    Java基础——关于接口和抽象类的几道练习题
    Eclipse中导入外部jar包步骤
    Java基础——关于jar包的知识
    Java基础——关于访问权限的一道例题
    Java基础——抽象类和接口
    Java基础——多态
    Java基础——继承
    三个案例,解读静态代码块和构造代码块
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/10793434.html
Copyright © 2011-2022 走看看