#include<iostream>
#include<algorithm>
#include<vector>
#include <cstring>
#include<climits>
using namespace std;
int a[100][100], vs[100], n, d[100], truoc[100];
int MAX = 999999;
void dijkstra(int start) {
d[start] = 0;
vs[start] = 1;
for (int i = 1; i <= n; i++) {
d[i] = a[start][i];
truoc[i] = start;
}
while (true) {
for (int i = 1; i <= n; i++) cout << d[i] << "|" << truoc[i] << " ";
cout << endl;
int u = 0, min = MAX;
for (int i = 1; i <= n; i++) {
if (!vs[i] && d[i] < min) {
u = i;
min = d[i];
}
}
if (u == 0) break;
cout << "Tham dinh: " << u << endl;
vs[u] = 1;
for (int i = 1; i <= n; i++) {
if (!vs[i] && d[i] > d[u] + a[u][i]) {
d[i] = d[u] + a[u][i];
truoc[i] = u;
}
}
}
}
int main() {
cout << "So dinh: ";
cin >> n;
// Khoi tao ma tran ke
cout << "Nhap ma tran:\n";
memset(vs, 0, sizeof(vs));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
if (a[i][j] == 0 && i != j) a[i][j] = MAX;
}
}
int start, goal;
cout << "Bat dau: ";
cin >> start;
dijkstra(start);
}
/**
Test:
5
0 7 5 8 2
0 0 0 0 0
0 1 0 1 0
0 1 0 0 0
0 0 0 1 0
5
0 2 0 8 5
2 0 1 3 0
0 1 3 1 0
8 3 1 0 1
5 0 0 1 0
**/
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGU8Y2xpbWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBhWzEwMF1bMTAwXSwgdnNbMTAwXSwgbiwgZFsxMDBdLCB0cnVvY1sxMDBdOwppbnQgTUFYID0gOTk5OTk5OwoKdm9pZCBkaWprc3RyYShpbnQgc3RhcnQpIHsKICBkW3N0YXJ0XSA9IDA7CiAgdnNbc3RhcnRdID0gMTsKICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgIGRbaV0gPSBhW3N0YXJ0XVtpXTsKICAgIHRydW9jW2ldID0gc3RhcnQ7CiAgfQogIHdoaWxlICh0cnVlKSB7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGNvdXQgPDwgZFtpXSA8PCAifCIgPDwgdHJ1b2NbaV0gPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwogICAgaW50IHUgPSAwLCBtaW4gPSBNQVg7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBpZiAoIXZzW2ldICYmIGRbaV0gPCBtaW4pIHsKICAgICAgICAgICAgdSA9IGk7CiAgICAgICAgICAgIG1pbiA9IGRbaV07CiAgICAgICAgfQogICAgfQogICAgaWYgKHUgPT0gMCkgYnJlYWs7CiAgICBjb3V0IDw8ICJUaGFtIGRpbmg6ICIgPDwgdSA8PCBlbmRsOwogICAgdnNbdV0gPSAxOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgaWYgKCF2c1tpXSAmJiBkW2ldID4gZFt1XSArIGFbdV1baV0pIHsKICAgICAgICAgICAgZFtpXSA9IGRbdV0gKyBhW3VdW2ldOwogICAgICAgICAgICB0cnVvY1tpXSA9IHU7CiAgICAgICAgfQogICAgfQogIH0KfQoKaW50IG1haW4oKSB7CiAgICBjb3V0IDw8ICJTbyBkaW5oOiAiOwogICAgY2luID4+IG47CiAgICAvLyBLaG9pIHRhbyBtYSB0cmFuIGtlCiAgICBjb3V0IDw8ICJOaGFwIG1hIHRyYW46XG4iOwogICAgbWVtc2V0KHZzLCAwLCBzaXplb2YodnMpKTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspIHsKICAgICAgICAgICAgY2luID4+IGFbaV1bal07CiAgICAgICAgICAgIGlmIChhW2ldW2pdID09IDAgJiYgaSAhPSBqKSBhW2ldW2pdID0gTUFYOwoKICAgICAgICB9CiAgICB9CiAgICBpbnQgc3RhcnQsIGdvYWw7CiAgICBjb3V0IDw8ICJCYXQgZGF1OiAiOwogICAgY2luID4+IHN0YXJ0OwogICAgZGlqa3N0cmEoc3RhcnQpOwoKfQoKLyoqClRlc3Q6Cgo1CjAgNyA1IDggMgowIDAgMCAwIDAKMCAxIDAgMSAwCjAgMSAwIDAgMAowIDAgMCAxIDAKCgoKNQowIDIgMCA4IDUKMiAwIDEgMyAwCjAgMSAzIDEgMAo4IDMgMSAwIDEKNSAwIDAgMSAwCgoKKiov