一个人的旅行
个人心得:不得不承认,有关平面图形空间感啥还是有很多不足,因为不足所以都不能很好把问题转化,更不能知道如何去想出方法,很无奈呀,得多想想这些方面了;
这一题一是不会很好的运用最短路算法,二是没能够很好的把问题转化。
后面看了题解才发现可以这样,可以将自己城镇到相邻的城镇也变成一条路径,这样求到所要去的地方就一目了然,
变成了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个数,表示草儿想去地方。
接着有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 }