题意
输入两个数字,第一个数字为m,代表边的个数,第二个数字为n,代表点的个数,输入m条边,求最短路
题解
Dijkstra模板题。N次循环,每次循环挑选距离起始点最短且未访问的点,然后更新与此点有关的所有未访问的点到起始点的距离。N次循环后,便可得出起始点到任意一点的最短距离。
注意事项
此题要注意重边的情况,需要在边输入时,对重边进行过滤。还要注意,第一个数字为m,代表边的个数,第二个才是n,代表点的个数。
代码
#include <iostream>
#include<cstdio>
#include<algorithm>
#define MAX_N 1010
#define MAX_M 2010
#define INF 1e9
using namespace std;
int d[MAX_N];
bool visited[MAX_N];
int w[MAX_M][MAX_M];
int n,m;
void dijkstra(int s){
for(int i=1;i<=n;i++)
d[i]=INF;
d[s]=0;
for(int i=0;i<n;i++){
int x=0,maxx=-1;
for(int j=1;j<=n;j++){
if(!visited[j]&&(maxx==-1||maxx>d[j])){
maxx=d[x=j];
}
}
visited[x]=true;
for(int j=1;j<=n;j++){
if(!visited[j]){
d[j]=min(d[x]+w[x][j],d[j]);
}
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
w[i][j]=INF;
}
}
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(w[a][b]>c)
w[a][b]=w[b][a]=c;
}
dijkstra(1);
printf("%d\n",d[n]);
return 0;
}