HDU

来源:互联网 发布:360浏览器注入js 编辑:程序博客网 时间:2024/06/03 20:21

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066点击打开链接


一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 40053    Accepted Submission(s): 13602


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 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10
 

Sample Output
9
 

Author
Grass
 

将相邻城镇话费看作0 一次dijkstra


#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#include<map>#include<math.h>#include<limits.h>#include<vector>#include <set>using namespace std;int t,s,d;struct xjy{    int num;    int dis;    bool operator < (const xjy &r) const    {        return dis>r.dis;    }};vector<int > want;int maxx;xjy dis[1111];xjy mmap[1111][1111];int book[1111];priority_queue<xjy>q;void dijkstra(int begin){    xjy mid;    dis[begin].dis=0;    dis[begin].num=begin;    mid=dis[begin];    q.push(mid);    while(!q.empty())    {        mid=q.top();        q.pop();        for(int i=0;i<=maxx;i++)        {            if(!book[i]&&dis[i].dis>=mmap[mid.num][i].dis+dis[mid.num].dis&&mmap[mid.num][i].dis<INT_MAX)            {                if(dis[i].dis==mmap[mid.num][i].dis+dis[mid.num].dis)                    continue;                dis[i].dis=mmap[mid.num][i].dis+dis[mid.num].dis;                dis[i].num=i;                q.push(dis[i]);            }        }    }}int main(){        while(~scanf("%d%d%d",&t,&s,&d))    {        maxx=0;        want.clear();        for(int i=0;i<=1005;i++)            for(int j=0;j<=1005;j++)            {                if(i==j)                    mmap[i][j].dis=0;                else                    mmap[i][j].dis=INT_MAX;            }        for(int i=0;i<=1005;i++)        {            dis[i].dis=INT_MAX;            book[i]=0;        }        for(int i=1;i<=t;i++)        {            int mid1,mid2,mid3;            scanf("%d%d%d",&mid1,&mid2,&mid3);            maxx=max(maxx,mid1);            maxx=max(maxx,mid1);            if(mmap[mid1][mid2].dis>mid3)            {                mmap[mid1][mid2].dis=mid3;                mmap[mid2][mid1].dis=mid3;            }        }        for(int i=1;i<=s;i++)        {            int mid;            scanf("%d",&mid);            maxx=max(maxx,mid);            if(mmap[0][mid].dis>0)            {                mmap[0][mid].dis=0;                mmap[mid][0].dis=0;            }        }                for(int i=1;i<=d;i++)        {            int mid;            scanf("%d",&mid);            want.push_back(mid);            maxx=max(maxx,mid);        }        dijkstra(0);        int ans=INT_MAX;        for(int i=0;i<want.size();i++)            ans=min(ans,dis[want[i]].dis);        cout << ans << endl;    }}




原创粉丝点击