【题目描述】
罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。
现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
【输入】
输入n, m,表示n个城市和m条路;
接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
【输出】
输出1到n的最短路。如果1到达不了n,就输出-1。
【输入样例】
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
【输出样例】
90
【提示】
【数据规模和约定】
1≤n≤2000
1≤m≤10000
0≤c≤10000
AC代码:
#include<bits/stdc++.h>
#define inf 9999999999
#define N 3001
#define M 30001
using namespace std;
int v[N][N],dis[M],b[M],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)for(int k=1;k<=n;k++)v[i][k]=inf;
for(int i=1;i<=m;i++){
int x,y,e;
cin>>x>>y>>e;
v[x][y]=v[y][x]=min(v[y][x],e);
}
for(int i=2;i<=n;i++)dis[i]=v[1][i];
memset(b,0,sizeof(b));
b[1]=1;
for(int i=1;i<=n-1;i++){
int min1=inf;
int z=1;
for(int k=1;k<=n;k++)
if(dis[k]<min1&&b[k]==0)
{
min1=dis[k];
z=k;
}
b[z]=1;
for(int x=1;x<=n;x++){
if(v[z][x]<inf){
if(dis[x]>dis[z]+v[z][x]){
dis[x]=dis[z]+v[z][x];
}
}
}
}
if(dis[n]==inf){
cout<<-1;
return 0;
}
cout<<dis[n];
return 0;
}
给个关注吧球球了