- 算法说明
迪杰斯特拉算法是要来求单源路径最短算法,与普里姆算法很相近,唯一的区别,这里刷新的是源点与其他点的距离
- 源代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 1000 + 1
#define inf 1 << 29
struct node {
int b, c;
node(int bb, int cc) {
b = bb;
c = cc;
}
};
int n, m;
vector<node> vt[maxn];
int dis[maxn];
bool vis[maxn];
void dijkstra(int u) {
fill(dis, dis + n, inf);
fill(vis, vis + n, false);
dis[u] = 0;
for(int k = 0; k < vt[u].size(); k++) {
int b = vt[u][k].b;
if(vis[b] == false && vt[u][k].c < dis[b]) {
dis[b] = vt[u][k].c;
}
}
for(int i = 0; i < n; i++) {
int v = -1, min = inf;
for(int j = 0; j < n; j++) {
if(vis[j] == false && dis[j] < min) {
v = j;
min = dis[j];
}
}
if(v == -1) {
return;
}
vis[v] = true;
for(int k = 0; k < vt[v].size(); k++) {
int b = vt[v][k].b;
if(vis[b] == false && vt[v][k].c + dis[v] < dis[b]) {
dis[b] = vt[v][k].c + dis[v];
}
}
}
}
int main() {
freopen("dijkstraAlgorihtm.txt", "r", stdin);
scanf("%d%d", &n, &m);
while(m--) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
vt[a].push_back(node(b, c));
}
dijkstra(0);
for(int i = 0; i < n; i++) {
printf("%d ", dis[i]);
}
return 0;
}
- 输入数据
- 运行结果