-
题目描述:
-
艾薇儿今天来到了中国,她计划两天后在哈尔滨举行一场个人的演唱会。由于出现了紧急情况,演唱会的举办方要求艾薇儿提前举行演唱会。艾薇儿现在在北京,她需要找出一条从北京到哈尔滨耗时最短的线路,以便尽快到达哈尔滨。
中国的铁路线非常复杂,有很多条路线可以从北京到达哈尔滨。艾薇儿在网上找到了铁路线各个线路上所需花费的时间,但是她还是看不出来哪一条线路可以最快地到达哈尔滨。你有办法帮助艾薇儿找出从北京到哈尔滨所需的最短时间吗?找出来的人可以免费获得现场演唱会门票一张哦。
-
输入:
-
输入的第一行包括一个整数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个,但不保证所有的城市都能互相到达。可以保证的是,从北京到哈尔滨一定会有一条通路。
#include<iostream>
#include<vector>
using namespace std;
struct E {
int next;
int c;
};
bool mark[101]; //标记是否属于k
int dis[101];
int main()
{
int n, m;
while (cin >> n >> m) {
int beg, end;
cin >> beg >> end;
vector<E> edge[101]; //邻接链表
while (m--) {
int a, b, c;
cin >>a >>b >>c;
E t;
t.c = c;
t.next = b;
edge[a].push_back(t); //双向
t.next = a;
edge[b].push_back(t);
}
for (int i=1; i<=n; ++i) {
dis[i] = -1;
mark[i] = false;
}
dis[beg] = 0; //节点加入k
mark[beg] = true;
int newp = beg;
for (int i=1; i<n; ++i) { //确定n-1个点最短距离
for (int j=0; j<edge[newp].size(); ++j) {
int t = edge[newp][j].next;
int c = edge[newp][j].c;
if (mark[t] == true)
continue;
if (dis[t] == -1 || dis[t] > dis[newp] +c )
dis[t] = dis[newp] + c;
}
int min = 9999999;
for (int j=1; j<=n; ++j) {
if (mark[j] == true)
continue;
if (dis[j] == -1)
continue;
if (dis[j] < min) {
min = dis[j];
newp = j;
}
}
mark[newp] = true;
}
cout << dis[end] << endl;
}
return 0;
}