时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
现在有n个车站和m条直达公交线路,每条线路都有一个固定票价。
作为一个窮人,你打算从车站1坐车到车站n,请计算下车站1到车站n的最少花费。
如果车站1无法到达车站n,请输出-1。
注意,在车站x和y之间可能存在不止一条线路。
输入格式
第一行两个整数n和m,表示车站数量和线路数量。(1<=n<=100),(1<=m<=1000)
第二行至第m+1行,每行3个整数a,b,x,代表车站a和车站b之间有一条票价为x的公交线路,公交线路是双向的。
输出格式
输出车站1到n的最小花费。
输入样例
4 4
1 2 4
2 3 7
2 4 1
3 4 6
输出样例
5
最短路模板题(迪杰斯特拉算法)
代码:
#include <iostream>
using namespace std;
int s[105]; //源点到v0到终点vi是否确定最短路
int arcs[105][105]; //矩阵记录边
int path[105]; //记录源点到v0到终点vi的直接前驱顶点序号
int d[105]; //记录源点到v0到终点vi的最短路径
int n,m; //顶点数 边数
const int MAX=0x3f3f3f3f;
int SP_DIJ(int k)
{
for(int v=1;v<=n;v++)//初始化
{
s[v]=0; //s初始为空集
d[v]=arcs[k][v]; //初始化为边上的权值
if(d[v]<MAX) path[v]=k; //如果k与v之间有弧,将v的前驱置为k
else path[v]=-1; //没弧,将v的前驱置为-1
}
s[k]=1; //将k加进s
d[k]=0; //源点到源点的距离为0
for(int i=2;i<=n;i++)//对剩余的顶点计算
{
int v,min=MAX;
for(int w=1;w<=n;w++)
if(!s[w]&&d[w]<min) //选择当前的最短路径,终点为v
{
v=w;min=d[w];
}
s[v]=1; //将v加进s
for(int w=1;w<=n;w++) //更新从v0出发到v-s上所有顶点的最短路径
{
if(!s[w]&&d[v]+arcs[v][w]<d[w])
{
d[w]=d[v]+arcs[v][w]; //更新的d[w]
path[w]=v; //更新w的前驱
}
}
}
if(d[n]>=MAX) return -1; //如果没路,返回-1
return d[n]; //返回最短路径
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)//矩阵初始化
{
for(int j=1;j<=n;j++)
arcs[i][j]=MAX;
}
int a,b,x;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>x;
if(x<arcs[a][b])//重边情况
{
arcs[a][b]=x;
arcs[b][a]=x;
}
}
int cnt=SP_DIJ(1);
cout<<cnt<<endl;
return 0;
}