#include <iostream>
using namespace std;
const static int MAX = 100;
const static int INFIT = 1000;
const static int WHITE = 0;
const static int GRAY = 1;
const static int BLACK = 2;
//用来表示图规模
int graph[MAX][MAX];
int n;
void dijkstra() {
int minv;
int d[MAX];
int color[MAX];
int u;
for(int i=0; i<n; i++) {
d[i] = INFIT;
color[i] = WHITE;
}
d[0] = 0;
color[0] = GRAY;
//找到当前最小点
while(1) {
minv = INFIT;
u = -1;
for(int i=0; i<n; i++) {
if(color[i] != BLACK && d[i] < minv ){
minv = d[i];
u = i;
}
}
//点孤立或点循环完
if(u==-1) break;
color[u] = BLACK;
//更新周围点
for(int i=0; i<n; i++) {
if(color[i] != BLACK) {
if(d[i] > d[u] + graph[u][i]) {
d[i] = d[u] + graph[u][i];
color[i] = GRAY;
}
}
}
}
for(int i=0; i<n; i++) {
printf("%d %d\n", i, (d[i] == INFIT)? -1 :d[i]);
}
}
int main() {
cin >> n;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
graph[i][j] = INFIT;
}
}
int n1, n2, n3, n4;
for(int i=0; i<n; i++) {
cin >> n1 >> n2;
for(int i=0; i<n2; i++) {
cin >> n3 >> n4;
graph[n1][n3] = n4;
}
}
dijkstra();
return 0;
}
单源最短路径
最新推荐文章于 2024-12-14 22:41:08 发布