HDU 2066 一个人的旅行

来源:互联网 发布:泰瑞克埃文斯生涯数据 编辑:程序博客网 时间:2024/06/06 07:17

题目链接

题目意思

给你T条路,现在小草要从S个与他相邻的城市出发,去D个目的地中的一个,要你求到达目的地的最短时间。

解题思路

这就一道用dijkstra的最短路的题。这道题中的坑点就是小草到他相邻的城市的距离是0。用dijkstra跑一遍就出答案啦!

代码部分

#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>#include <queue>using namespace std;const int INF=99999;int map[1010][1010];int dis[1010];///存储最短路int vis[1010];///标记数组int nex[1010];///记录与他相邻的城市int ed[1010];///记录目的地int t,s,d,n;int dijkstra(){    int pos;    memset(vis,0,sizeof(vis));    for(int i=0; i<=n; i++)        dis[i]=map[0][i];    vis[0]=1;    for(int i=1; i<=n; i++)    {        int min=INF;        for(int j=1; j<=n; j++)        {            if(!vis[j]&&min>dis[j])            {                min=dis[j];                pos=j;            }        }        vis[pos]=1;        for(int j=1; j<=n; j++)        {            if(!vis[j]&&dis[j]>map[pos][j]+dis[pos])                dis[j]=map[pos][j]+dis[pos];        }    }}int main(){    int a,b,tim,ans;    while(scanf("%d%d%d",&t,&s,&d)!=EOF)    {        n=0;        for(int i=0; i<1010; i++)            for(int j=0; j<1010; j++)            {                map[i][j]=INF;                map[i][i]=0;            }        while(t--)        {            scanf("%d%d%d",&a,&b,&tim);            n=max(max(n,a),b);            if(map[a][b]>tim)                map[a][b]=map[b][a]=tim;        }        ans=INF;        for(int i=0; i<s; i++)        {            scanf("%d",&nex[i]);            map[0][nex[i]]=map[nex[i]][0]=0;        }        for(int i=0; i<d; i++)        {            scanf("%d",&ed[i]);        }        dijkstra();        for(int i=0; i<d; i++)        {            ans=min(ans,dis[ed[i]]);        }        printf("%d\n",ans);    }    return 0;}