1 /*
2 Author: Leo.W
3 Descriptipn: 给定图上的n个点及m条点间连线,试求从S点到W点的最短距离,若不存在,则输出-1;
4 How to Do: 经典的最短路算法的应用,dijkstra算法自编写
5 */
6 #include <iostream>
7 using namespace std;
8 int n,m;//点的个数,点间连线的条数
9 int path[205][1005];
10 bool node[205];
11 int Dijkstras(int s,int w){
12 int i,j;
13 node[s]=true;
14 for(i=0;i<n;i++){
15 int mins=INT_MAX,pos=s;
16 for(j=0;j<n;j++){//寻找为选入点的最小值
17 if(!node[j]&&mins>path[s][j]){
18 mins=path[s][j]; pos=j;
19 }
20 }
21 if(mins==INT_MAX||j>n) break;
22 node[pos]=true;
23 for(j=0;j<n;j++){
24 if(!node[j]&&path[pos][j]!=INT_MAX&&path[s][j]>path[s][pos]+path[pos][j]){
25 path[s][j]=path[s][pos]+path[pos][j];
26 path[j][s]=path[s][j];
27 }
28 }
29 }
30 return path[s][w];
31 }
32 int main(){
33 //freopen("in.txt","r",stdin);
34 while(scanf("%d%d",&n,&m)!=EOF){
35 int i,j;
36 for(i=0;i<n;i++){
37 node[i]=false;
38 for(j=0;j<n;j++){
39 if(j==i) path[i][j]=0;
40 else path[i][j]=INT_MAX;//表示两点间无通路
41 }
42 }
43 for(i=0;i<m;i++){
44 int begin,end,len;
45 scanf("%d%d%d",&begin,&end,&len);
46 if(len<path[begin][end])//此处是全题关键,WA了很久。。。。【审题要细致啊】
47 path[begin][end]=path[end][begin]=len;//双向赋值
48 }
49 int s,w;
50 scanf("%d%d",&s,&w);
51 if(s>w){
52 s=s^w;w=s^w;s=s^w;
53 }
54 if(s==w)
55 printf("0\n");
56 else{
57 int ans=Dijkstras(s,w);
58 if(ans==INT_MAX) printf("-1\n");
59 else printf("%d\n",ans);
60 }
61 }
62 return 0;
63 }
posted on 2012-03-04 12:30
Leo.W 阅读(233)
评论(0) 编辑 收藏 引用