一个人的旅行 dij(),评测的时候有点惨

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
***************************************************************************************************************************
 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<cstdio>
 7 using namespace std;
 8 const int inf=1<<29;
 9 int dis[1111];
10 int map[1111][1111];
11 int T,D,S,n;
12 int src[1111],love[1111];
13 bool vis[1111];
14 int i,j,k;
15 void bellman(int s)
16 {
17     int it,jt,gs;
18     int minn;
19     for(it=1;it<=1050;it++)
20      {
21          dis[it]=map[s][it];
22          //cout<<"dis:: "<<dis[it]<<endl;
23      }
24 
25      vis[s]=true;
26      dis[s]=0;
27     for(it=1;it<1050;it++)
28     {
29         minn=inf;
30         for(jt=1;jt<=1050;jt++)
31         {
32             if(!vis[jt]&&dis[jt]<minn)
33             {
34                 minn=dis[jt];
35                 gs=jt;
36             }
37         }
38         vis[gs]=true;
39         if(minn==inf)break;
40         for(jt=1;jt<=1050;jt++)
41         {
42             if(!vis[jt]&&dis[jt]>map[gs][jt]+dis[gs]&&map[gs][jt]!=inf)
43               dis[jt]=dis[gs]+map[gs][jt];
44             //cout<<"dis:: "<<dis[jt]<<endl;
45         }
46     }
47 }
48 int main()
49 {
50     int a,b,time;
51     while(~scanf("%d%d%d",&T,&S,&D))
52     {
53         n=0;
54         for(i=0;i<=1050;i++)
55          for(j=0;j<=1050;j++)
56           map[i][j]=inf;
57         for(i=0;i<=1050;i++)
58          map[i][i]=0;
59         for(i=1;i<=T;i++)
60         {
61             scanf("%d%d%d",&a,&b,&time);
62             if(map[a][b]>time)
63              map[a][b]=map[b][a]=time;
64             //if(a>n)n=a;
65             //if(b>n)n=b;
66         }
67         for(i=1;i<=S;i++)
68          scanf("%d",&src[i]);
69         for(i=1;i<=D;i++)
70          scanf("%d",&love[i]);
71          int mintime=inf;
72         for(i=1;i<=S;i++)
73         {
74             memset(vis,false,sizeof(vis));
75             bellman(src[i]);
76             for(j=1;j<=D;j++)
77             {
78                 //cout<<"dis:: "<<dis[love[j]]<<endl;
79                 if(dis[love[j]]<mintime)
80                   mintime=dis[love[j]];
81             }
82         }
83         printf("%d\n",mintime);
84     }
85     return 0;
86 }
View Code

 

posted @ 2013-11-17 21:45  persistent codeants  阅读(268)  评论(0编辑  收藏  举报