一个人的旅行

个人心得:不得不承认,有关平面图形空间感啥还是有很多不足,因为不足所以都不能很好把问题转化,更不能知道如何去想出方法,很无奈呀,得多想想这些方面了;

这一题一是不会很好的运用最短路算法,二是没能够很好的把问题转化。

后面看了题解才发现可以这样,可以将自己城镇到相邻的城镇也变成一条路径,这样求到所要去的地方就一目了然,

变成了0到所有想去的了,就完美转变为求0到N的最短路问题了,佩服,这方面的思维还是太水。

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^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<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iomanip>
 6 #include<algorithm>
 7 using namespace std;
 8 const long long inf=99999999;
 9 int n,m,d;
10 int flag;
11 const int maxn=1111;
12 int country[maxn][maxn];
13 int book[maxn];
14 int aim[maxn];
15 int dis[maxn];
16 void init()
17 {
18     for(int i=0;i<maxn;i++)
19         for(int j=0;j<maxn;j++)
20           if(i==j) country[i][j]=0;
21     else country[i][j]=inf;
22 
23 }
24 void Dijkstra()
25 {
26     memset(book,0,sizeof(book));
27     for(int i=0;i<=flag;i++) dis[i]=country[0][i];
28     book[0]=1;
29     for(int i=0;i<=flag;i++)
30     {
31         int mina=inf;
32         int k;
33         for(int j=1;j<=flag;j++)
34         {
35             if(!book[j]&&dis[j]<mina)
36             {
37                 mina=dis[j];
38                 k=j;
39             }
40     }
41     book[k]=1;
42     for(int j=0;j<=flag;j++)
43         if(!book[j]&&dis[j]>dis[k]+country[k][j])
44            dis[j]=dis[k]+country[k][j];
45 
46 }
47 }
48 int main()
49 {
50     while(cin>>n>>m>>d){
51             init();
52             flag=0;
53             int next[maxn];
54             int x,y,z;
55             for(int i=1;i<=n;i++){
56                 cin>>x>>y>>z;
57                 flag=max(x,flag);
58                 flag=max(flag,y);
59                 if(z<country[x][y])
60                     country[x][y]=country[y][x]=z;
61             }
62             for(int i=1;i<=m;i++){
63               cin>>next[i];
64               country[0][next[i]]=country[next[i]][0]=0;
65             }
66             for(int i=1;i<=d;i++)
67                 cin>>aim[i];
68                 Dijkstra();
69                 int sum=inf;
70               for(int i=1;i<=d;i++)
71                 sum=min(sum,dis[aim[i]]);
72               cout<<sum<<endl;
73 
74     }
75 
76     return 0;
77 }
原文地址:https://www.cnblogs.com/blvt/p/7323599.html