题目描述
一天,体格健壮的MLH(什么鬼)又开始了马拉松的锻炼,可是有一天MLH跑得太远了,回去要很长的一段时间。他要从第1个路口走回第n个路口。他找到了你,求你帮他找到最快的路径,使他可以最快的回到家。
输入
输入共m+1行,第一行包括三个数,n,m,即路口个数,路径个数。
接下来m行,每行三个整数,x,y,v,即从第x个路口到第y个路口要花v的时间(每条路是单向的)。
输出
输出只有一行,即所需最短时间。
样例输入
5 5
1 2 1
2 3 2
3 4 2
2 4 5
4 5 1
样例输出
6
提示
【数据说明】
对于100%的数据,2<=n<=10000,1<=m<=20000,0<=v<=100,000;
code:
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#define SIZE 10001
using namespace std;
struct edge
{
int s, t, dis;
};
int d[SIZE], count[SIZE];
queue<int> q;
vector<edge> v[SIZE];
bool inqueue[SIZE];
void spfa(int start) // 进行SPFA求最短路径
{
int temp, temp2, temp3, i;
memset(d, 127, sizeof (d));
d[start] = 0;
++count[start];
q.push(start);
while (!q.empty())
{
temp = q.front();
q.pop();
inqueue[temp] = false;
for (i = 0; i < v[temp].size(); ++i)
{
temp2 = v[temp][i].t;
temp3 = v[temp][i].dis;
if (d[temp] + temp3 < d[temp2])
{
d[temp2] = d[temp] + temp3;
if (!inqueue[temp2])
{
q.push(temp2);
inqueue[temp2] = true;
++count[temp2];
}
}
}
}
return;
}
int main(void)
{
int m, n, temp, temp2, temp3;
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d%d%d", &temp, &temp2, &temp3);
v[temp].push_back({temp, temp2, temp3});
}
spfa(1);
printf("%d", d[n]);
return 0;
}