一、目的
解决单源最短路径问题,求解从起点到其余各点的最短距离。
二、思想
- 每次寻找距离起点最短距离且没有被访问的点
- 根据这个点更新起点到各点的最短距离
- 以上内容循环n次(n为结点数)
三、代码
#include <cstdio>
#include <algorithm>
using namespace std;
int maxdis=10000;
int main(){
int n,e; scanf("%d %d",&n,&e); //输入结点和边数
int graphic[n][n]; //创建图
fill(graphic[0],graphic[0]+n*n,maxdis); //初始化图
for (int i = 0; i < e; ++i) {
int a,b,w; scanf("%d %d %d",&a,&b,&w);
graphic[a][b]=w;
}
int dis[n]; //初始化距离数组
for (int k = 0; k < n; ++k) {
dis[k] = maxdis;
}
dis[0]=0; //起点为0
bool visited[n]; //初始化访问判别数组
for (int j = 0; j < n; ++j) {
visited[j]=false;
}
//遍历N次
for (int k = 0; k < n; ++k) {
//寻找距离起点距离最短,且没有被访问的点
int min = maxdis;
int val = -1;
for (int i = 0; i < n; ++i) {
if(dis[i]<min && visited[i]==false){
min = i;
val = dis[i];
}
}
visited[min]=true;
//更新距离
for (int j = 0; j < n; ++j) {
if(graphic[min][j]!=maxdis && graphic[min][j] + val < dis[j])
dis[j] = graphic[min][j] + val;
}
}
for (int l = 0; l < n; ++l) {
printf("%d ",dis[l]);
}
}
输入:
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
输出:0 1 5 3 4 6
四、其它
不能存在负权。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。