#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 bellmanFord(int start){
d[start] = 0;
vs[start] = 1;
for (int i = 1; i <= n; i++) {
d[i] = a[start][i];
truoc[i] = start;
cout << d[i] << "|" << truoc[i] << " ";
}
cout << endl;
int k = 1;
bool done = true;
while (k <= n-2) {
done = true;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (d[i] > d[j] + a[j][i]) {
d[i] = d[j] + a[j][i];
truoc[i] = j;
done = false;
}
}
}
for (int i = 1; i <= n; i++) {
cout << d[i] << "|" << truoc[i] << " ";
}
cout << endl;
k++;
}
if (!done) cout << "Do thi co chu trinh am";
}
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;
bellmanFord(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
4
0 4 3 0
0 0 -2 0
0 0 0 2
-1 0 0 0
**/
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGU8Y2xpbWl0cz4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmludCBhWzEwMF1bMTAwXSwgdnNbMTAwXSwgbiwgZFsxMDBdLCB0cnVvY1sxMDBdOwppbnQgTUFYID0gOTk5OTk5OwoKdm9pZCBiZWxsbWFuRm9yZChpbnQgc3RhcnQpewogICAgZFtzdGFydF0gPSAwOwogICAgdnNbc3RhcnRdID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGRbaV0gPSBhW3N0YXJ0XVtpXTsKICAgICAgICB0cnVvY1tpXSA9IHN0YXJ0OwogICAgICAgIGNvdXQgPDwgZFtpXSA8PCAifCIgPDwgdHJ1b2NbaV0gPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsOwoKICAgIGludCBrID0gMTsKICAgIGJvb2wgZG9uZSA9IHRydWU7CiAgICB3aGlsZSAoayA8PSBuLTIpIHsKICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoZFtpXSA+IGRbal0gKyBhW2pdW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgZFtpXSA9IGRbal0gKyBhW2pdW2ldOwogICAgICAgICAgICAgICAgICAgIHRydW9jW2ldID0gajsKICAgICAgICAgICAgICAgICAgICBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBjb3V0IDw8IGRbaV0gPDwgInwiIDw8IHRydW9jW2ldIDw8ICIgIjsKICAgICAgICB9CiAgICAgICAgY291dCA8PCBlbmRsOwogICAgICAgIGsrKzsKICAgIH0KICAgIGlmICghZG9uZSkgY291dCA8PCAiRG8gdGhpIGNvIGNodSB0cmluaCBhbSI7Cn0KCmludCBtYWluKCkgewogICAgY291dCA8PCAiU28gZGluaDogIjsKICAgIGNpbiA+PiBuOwogICAgLy8gS2hvaSB0YW8gbWEgdHJhbiBrZQogICAgY291dCA8PCAiTmhhcCBtYSB0cmFuOlxuIjsKICAgIG1lbXNldCh2cywgMCwgc2l6ZW9mKHZzKSk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgaisrKSB7CiAgICAgICAgICAgIGNpbiA+PiBhW2ldW2pdOwogICAgICAgICAgICBpZiAoYVtpXVtqXSA9PSAwICYmIGkgIT0gaikgYVtpXVtqXSA9IE1BWDsKCiAgICAgICAgfQogICAgfQogICAgaW50IHN0YXJ0LCBnb2FsOwogICAgY291dCA8PCAiQmF0IGRhdTogIjsKICAgIGNpbiA+PiBzdGFydDsKICAgIGJlbGxtYW5Gb3JkKHN0YXJ0KTsKCgoKfQoKLyoqClRlc3Q6Cgo1CjAgNyA1IDggMgowIDAgMCAwIDAKMCAxIDAgMSAwCjAgMSAwIDAgMAowIDAgMCAxIDAKCjQKMCA0IDMgMAowIDAgLTIgMAowIDAgMCAyCi0xIDAgMCAwCgoqKi8=