https://pintia.cn/problem-sets/1376345205419614208/problems/1376347887052070915
给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路。
如题,单源最短路径问题,用Dijkstra算法解决
#include<iostream>
using namespace std;
#define MAX 1001
#define INF 65535
int e[MAX][MAX];
int dis[MAX];
bool book[MAX]={0};
/*
input:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
output:
0 1 8 4 13 17
*/
int main ()
{
int n,m,i,j,k,w;
int start,end;
scanf("%d %d",&n,&m);
cin>>start>>end;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
e[i][j]=0;
else
e[i][j]=INF;
}
for(k=0;k<m;k++)
{
scanf("%d %d %d",&i,&j,&w);
e[i][j]=w;
e[j][i]=w;
}
//Dijkstra
//假设起点是1
//int start=1,end;
for(i=1;i<=n;i++)
dis[i]=e[start][i];
dis[start]=0;//到自身的距离是0
book[start]=1;//1进入集合
for(i=2;i<=n;i++)
{
int minn=INF,k=-1;
for(j=1;j<=n;j++)
{
if(!book[j]&&minn>dis[j])
{
k=j;
minn=dis[j];
}
}
if(k==-1) break;
book[k]=1;
for(j=1;j<=n;j++)
{
if(!book[j]&&dis[j]>dis[k]+e[k][j])
{
dis[j]=dis[k]+e[k][j];
}
}
}
// for(i=1;i<=n;i++)
// printf("%d ",dis[i]);
cout<<dis[end];
return 0;
}