Dijstra算法-------为了纪念,等以后看的时候方便
杭电problem2066
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 27 Accepted Submission(s) : 6
Font: Times New Roman | Verdana | Georgia
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<cstring> 3 //#include<fstream> 4 using namespace std; 5 int T,S,D; 6 int arr[1004][1004]; 7 bool judge[1004]; 8 int d[1004]; 9 10 void Dijkstra(int star,int endf)//此处就是我上篇写的模板,只是改动了参数变量以及那因题而异的“最小值”
11 { 12 for(int f=1;f<=endf;f++) 13 d[f]=arr[star][f]; 14 memset(judge,false,sizeof(judge)); 15 judge[star]=true; 16 d[star]=0; 17 for(int i=1;i<=endf;i++) 18 { 19 int min=10000000000,g=0; 20 for(int k=1;k<=endf;k++) 21 if(!judge[k]&&d[k]<min) 22 { 23 min=d[k]; 24 g=k; 25 } 26 judge[g]=true; 27 for(int j=1;j<=endf;j++) 28 if((d[g]+arr[g][j]<d[j])) 29 d[j]=d[g]+arr[g][j]; 30 31 } 32 } 33 int main() 34 { // freopen("in.txt","r",stdin); 35 int a,b,time,c; 36 while(cin>>T>>S>>D)
37 { int ma=0; 38 memset(arr,10,sizeof(arr)); 39 for(c=0;c<T;c++) 40 { 41 cin>>a>>b>>time; 42 if(time<arr[a][b]) 43 arr[a][b]=arr[b][a]=time; 44 if(a>ma) ma=a;//很牛的是这里,当然了也是看到大牛的杰作,这次会了,下次也就成大牛了
45 if(b>ma) ma=b;//ma就是用来求出顶点编号最大的
46 } 47 ma++;//最大的加一以后是什么结果呢
//就是相当于把草儿想去的地方归结到一个顶点,这样做的话,对于应用Dijstra是有很大的益处的
48 for(c=0;c<S;c++) {cin>>a;arr[0][a]=0;} 49 for(c=0;c<D;c++) {cin>>a;arr[a][ma]=0;}//那就是这句了
50 Dijkstra(0,ma); 51 cout<<d[ma]<<endl; 52 } 53 return 0; 54 }
思路很清晰吧!
再啰嗦一下思路:
1:首先按题目条件读入数据,并作适当处理,个人认为Dijstra算法如何应用取决与开始对数据的处理以及它内部的一些微小改变
(就如此题在开始的时候对数据进行预处理就大大简化了后面的操作)
2:直接用Dijstra算法模板,只不过那个参数要稍微改变一下
3:最大值一定要选取恰当,小的话就会wronganswer,大的话就有可能超时
好了就这么多了,保证我过一个月后能看懂就可以啦