-
题目描述:
-
艾薇儿今天来到了中国,她计划两天后在哈尔滨举行一场个人的演唱会。由于出现了紧急情况,演唱会的举办方要求艾薇儿提前举行演唱会。艾薇儿现在在北京,她需要找出一条从北京到哈尔滨耗时最短的线路,以便尽快到达哈尔滨。
中国的铁路线非常复杂,有很多条路线可以从北京到达哈尔滨。艾薇儿在网上找到了铁路线各个线路上所需花费的时间,但是她还是看不出来哪一条线路可以最快地到达哈尔滨。你有办法帮助艾薇儿找出从北京到哈尔滨所需的最短时间吗?找出来的人可以免费获得现场演唱会门票一张哦。
-
输入:
-
输入的第一行包括一个整数N(2<=N<=100),代表艾薇儿手上拿到的设有铁路站点的城市的个数,其中城市从1到n进行编号。以及M(1<=M<=1000),代表有M条铁路线路,每条铁路线路只连接两个城市。
接下来的一行有两个数,a和b(1<=a,b<=N),分别表示北京和哈尔滨的编号。
接下来有M行,每行有三个数x,y(1<=x,y<=N),t(1<=t<=1000),表示从城市x到城市y所需时间为t。
-
输出:
-
请输出艾薇儿从北京到哈尔滨最少需要多长时间。你可以放心地认为肯定存在一条路线可以从北京到哈尔滨。
-
样例输入:
-
3 4 1 3 1 2 1 3 2 3 2 3 4 3 1 8
-
样例输出:
-
4
-
提示:
-
1.火车能从城市x到城市y,就能从城市y到城市x,并且同一列火车来回所花费的时间是一样的。如果在x和y之间有不止一辆火车通行,则不同火车从x到y或者从y到x所花费的时间可能不相同。
2.虽然城市数有N个,但不保证所有的城市都能互相到达。可以保证的是,从北京到哈尔滨一定会有一条通路。
-
-
/
-
采用Dijkstra算法来计算最短路径,由于北京和哈尔滨城市的代号不一定,所以要以北京的代号作为出发点,哈尔滨的代号作为结束点。
-
具体看代码:
-
-
#include<iostream> #include<string.h> using namespace std; int v[101][101]; bool used[101]; int int_max=21474836; int m,n,a,b; int main() { int j,k,i; int tp1,tp2,tv; int sum[101]; while(cin>>n>>m>>a>>b) { memset(v,int_max,sizeof(v));//这个其实有点错误,就是memset好像只能按照字节来赋值,但是也过了,说明路径最大值还是比较小的 memset(used,false,sizeof(used));//所有点全部初始化为未访问过 memset(sum,int_max,sizeof(sum));//所有初始点到当前点的路径值全部设置为未到达,也和上面一样的错误 for(j=0;j<m;j++) { cin>>tp1>>tp2>>tv; if(v[tp1][tp2]>tv) { v[tp1][tp2]=tv; v[tp2][tp1]=tv; } } for(j=1;j<=n;j++)//将北京设置为出发点 sum[j]=v[a][j]; used[a]=true; sum[a]=0; for(j=0;j<n-1;j++) { tv=int_max; for(k=1;k<=n;k++) if(!used[k]&&sum[k]!=int_max&&tv>sum[k])//找到最短的、未访问的已达点 { tv=sum[k]; tp2=k; } if(tv==int_max) break; used[tp2]=true; for(k=1;k<=n;k++) if(!used[k]&&v[tp2][k]<int_max&&sum[k]>sum[tp2]+v[tp2][k])//将最短的已达点设置成访问过,并且更新这个点相邻的点的最短路径 sum[k]=sum[tp2]+v[tp2][k]; } cout<<sum[b]<<endl; } return 0; } /************************************************************** Problem: 1341 User: 午夜小白龙 Language: C++ Result: Accepted Time:70 ms Memory:1560 kb ****************************************************************/