题目描述:
给出一个n个点,m条无向边的(带非负边权)的图,求出从1走到n的最短路
n <= 1000 , m <= 2000,有重边。
样例输入
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出
90
完整代码:
#include <iostream>
#include <cstdlib>
using namespace std;
const int M = 1001;
int edge[M][M];
int path[M] , dist[M] , S[M] , T[M];
int u , v , m , n , w;
//3.Dijkstra 的初始化
void D(int u)
{
for(int i = 1 ; i <= n ; i++)
{
S[i] = 0;
dist[i] = edge[u][i];
}
S[u] = 1;//根
}
int main()
{
cin >> n >> m;
//1.初始化edge
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= n ; j++)
if(i != j)
edge[i][j] = 0x3f3f3f3f;//无穷大
//2.读入无向图
for(int i = 1 ; i <= m ; i++)
{
cin >> u >> v >> w;
edge[u][v] = min(edge[u][v] , w);//重边选取短的那条边权
edge[v][u] = min(edge[v][u] , w);
}
//3.Dijkstra初始化
D(1);
//4.循环部分
for(int i = 1 ; i < n ; i++)
{
int min = 0x3f3f3f3f;
v = u;
//S[j] = 0 , 并且dist[j] < min ,则赋值给min v=j
for(int j = 1 ; j <= n ; j++)
if(!S[j] && dist[j] < min)
{
min = dist[j];
v = j;
}
S[v] = 1; //标记并且在后面进行有关S[v]的其他点的情况处理
for(int j = 1 ; j <= n ; j++) //更新
if(!S[j] && dist[v] + edge[v][j] < dist[j])
dist[j] = dist[v] + edge[v][j];
}
cout << dist[5];
return 0;
}