#include <iostream>
#include <vector>
using namespace std;
int getPreviousVertex(int *mas, int vertex)
{
return mas[vertex];
}
int main(void) {
std::vector<int> mas;
const int N = 9;
int pre[N],start = 3, D[N];
int g=1000; //бесконечность
bool flag[N];
int A[N][N] = {
{0, 1, g, 5, 1, g, g, 1, g},
{1, 0, 7, 4, g, g, g, g, g},
{g, 7, 0, g, g, 2, 1, g, g},
{5, 4, g, 0, g, 8, g, g, g},
{1, g, g, g, 0, g, g, 1, g},
{g, g, 2, 8, g, 0, 4, g, 4},
{g, g, 1, g, g, 4, 0, g, 4},
{g, g, g, g, g, g, g, g, g},
{g, g, g, g, g, g, g, g, g},
};
string names[N] = {"R1","R2","R3","R4","R5","R6","R7","N1","N2"};
string edges[N][N] = {
{"0", "A", "0", "B", "E", "0", "0", "P1", "0"},
{"A", "0", "D", "I", "0", "0", "0", "0", "0"},
{"0", "D", "0", "0", "0", "H", "F", "0", "0"},
{"B", "I", "0", "0", "0", "H", "0", "0", "0"},
{"E", "0", "0", "0", "0", "0", "0", "P2", "0"},
{"0", "0", "H", "H", "0", "0", "0", "0", "P4"},
{"0", "0", "F", "0", "0", "0", "0", "0", "P3"},
{"0", "0", "0", "0", "0", "0", "0", "0", "0"},
{"0", "0", "0", "0", "0", "0", "0", "0", "0"},
};
for (int i = 0; i < N; i++) {
pre[i] = start;
flag[i] = false;
D[i] = A[start][i];
}
flag[start] = true;
pre[start] = 0;
for (int i = 0; i < N ; i++) {
int k = 0;
int minras = g;
// Находим минимальное расстояние до непомеченных вершин
for (int j = 0; j < N; j++) {
if (!flag[j] && minras > D[j]) {
minras = D[j];
k = j;
}
}
// Вершина k помечается просмотренной
flag[k] = true;
for (int j = 0; j < N; j++) {
if (!flag[j] && D[j] > D[k] + A[k][j]) {
D[j] = D[k] + A[k][j];
pre[j] = k;
}
}
}
int size;
int curVertex, prevVertex, sourceVertex = start, myVertex, tmp;
for(int i = 0; i<N; i++) {
int m = 0;
curVertex = i;
myVertex = curVertex;
if (sourceVertex != curVertex)
{
do
{
mas.push_back(curVertex);
prevVertex = getPreviousVertex(pre, curVertex);
curVertex = prevVertex;
m++;
} while (curVertex != sourceVertex);
mas.push_back(curVertex);
size = mas.size();
cout << "Distance to " << names[myVertex] << ": " << D[myVertex] << "; Path: ";
for (int j=size-1; j>=0; j--)
{
tmp = mas[j];
if(size-1 == j)
{
cout << names[tmp];
}
else
{
int prev = mas[j+1], next = mas[j];
cout << " -(" << edges[prev][next] << ")-> " << names[tmp];
}
mas.pop_back();
}
cout << endl;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGdldFByZXZpb3VzVmVydGV4KGludCAqbWFzLCBpbnQgdmVydGV4KSAKewoJcmV0dXJuIG1hc1t2ZXJ0ZXhdOwp9CgppbnQgbWFpbih2b2lkKSB7CglzdGQ6OnZlY3RvcjxpbnQ+IG1hczsgCgljb25zdCBpbnQgTiA9IDk7CgkKICAgIGludCBwcmVbTl0sc3RhcnQgPSAzLCBEW05dOwoJaW50IGc9MTAwMDsgLy/QsdC10YHQutC+0L3QtdGH0L3QvtGB0YLRjAogICAgYm9vbCBmbGFnW05dOwogICAgCiAgICBpbnQgQVtOXVtOXSA9IHsKICAgICAgICB7MCwgMSwgZywgNSwgMSwgZywgZywgMSwgZ30sCiAgICAgICAgezEsIDAsIDcsIDQsIGcsIGcsIGcsIGcsIGd9LAogICAgICAgIHtnLCA3LCAwLCBnLCBnLCAyLCAxLCBnLCBnfSwKICAgICAgICB7NSwgNCwgZywgMCwgZywgOCwgZywgZywgZ30sCiAgICAgICAgezEsIGcsIGcsIGcsIDAsIGcsIGcsIDEsIGd9LAogICAgICAgIHtnLCBnLCAyLCA4LCBnLCAwLCA0LCBnLCA0fSwKCQl7ZywgZywgMSwgZywgZywgNCwgMCwgZywgNH0sCgkJe2csIGcsIGcsIGcsIGcsIGcsIGcsIGcsIGd9LAoJCXtnLCBnLCBnLCBnLCBnLCBnLCBnLCBnLCBnfSwKICAgIH07CglzdHJpbmcgbmFtZXNbTl0gPSB7IlIxIiwiUjIiLCJSMyIsIlI0IiwiUjUiLCJSNiIsIlI3IiwiTjEiLCJOMiJ9OwoJc3RyaW5nIGVkZ2VzW05dW05dID0gewogICAgICAgICB7IjAiLCAiQSIsICIwIiwgIkIiLCAiRSIsICIwIiwgIjAiLCAiUDEiLCAiMCJ9LAogICAgICAgICB7IkEiLCAiMCIsICJEIiwgIkkiLCAiMCIsICIwIiwgIjAiLCAiMCIsICIwIn0sCiAgICAgICAgIHsiMCIsICJEIiwgIjAiLCAiMCIsICIwIiwgIkgiLCAiRiIsICIwIiwgIjAifSwKICAgICAgICAgeyJCIiwgIkkiLCAiMCIsICIwIiwgIjAiLCAiSCIsICIwIiwgIjAiLCAiMCJ9LAogICAgICAgICB7IkUiLCAiMCIsICIwIiwgIjAiLCAiMCIsICIwIiwgIjAiLCAiUDIiLCAiMCJ9LAogICAgICAgICB7IjAiLCAiMCIsICJIIiwgIkgiLCAiMCIsICIwIiwgIjAiLCAiMCIsICJQNCJ9LAogICAgICAgICB7IjAiLCAiMCIsICJGIiwgIjAiLCAiMCIsICIwIiwgIjAiLCAiMCIsICJQMyJ9LAogICAgICAgICB7IjAiLCAiMCIsICIwIiwgIjAiLCAiMCIsICIwIiwgIjAiLCAiMCIsICIwIn0sCiAgICAgICAgIHsiMCIsICIwIiwgIjAiLCAiMCIsICIwIiwgIjAiLCAiMCIsICIwIiwgIjAifSwKCSB9OwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgcHJlW2ldID0gc3RhcnQ7CiAgICAgICAgZmxhZ1tpXSA9IGZhbHNlOwogICAgICAgIERbaV0gPSBBW3N0YXJ0XVtpXTsKICAgIH0KCiAgICBmbGFnW3N0YXJ0XSA9IHRydWU7CiAgICBwcmVbc3RhcnRdID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTiA7IGkrKykgewogICAgICAgIGludCBrID0gMDsKICAgICAgICBpbnQgbWlucmFzID0gZzsKICAgICAgICAvLyDQndCw0YXQvtC00LjQvCDQvNC40L3QuNC80LDQu9GM0L3QvtC1INGA0LDRgdGB0YLQvtGP0L3QuNC1INC00L4g0L3QtdC/0L7QvNC10YfQtdC90L3Ri9GFINCy0LXRgNGI0LjQvQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICAgICAgIGlmICghZmxhZ1tqXSAmJiBtaW5yYXMgPiBEW2pdKSB7CiAgICAgICAgICAgICAgICBtaW5yYXMgPSBEW2pdOwogICAgICAgICAgICAgICAgayA9IGo7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8g0JLQtdGA0YjQuNC90LAgayDQv9C+0LzQtdGH0LDQtdGC0YHRjyDQv9GA0L7RgdC80L7RgtGA0LXQvdC90L7QuQogICAgICAgIGZsYWdba10gPSB0cnVlOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICAgICAgIGlmICghZmxhZ1tqXSAmJiBEW2pdID4gRFtrXSArIEFba11bal0pIHsKICAgICAgICAgICAgICAgIERbal0gPSBEW2tdICsgQVtrXVtqXTsKICAgICAgICAgICAgICAgIHByZVtqXSA9IGs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoJaW50IHNpemU7CiAgICBpbnQgY3VyVmVydGV4LCBwcmV2VmVydGV4LCBzb3VyY2VWZXJ0ZXggPSBzdGFydCwgbXlWZXJ0ZXgsIHRtcDsKICAgIGZvcihpbnQgaSA9IDA7IGk8TjsgaSsrKSB7CiAgICAJaW50IG0gPSAwOwogICAgCWN1clZlcnRleCA9IGk7CiAgICAJbXlWZXJ0ZXggPSBjdXJWZXJ0ZXg7CiAgICAJaWYgKHNvdXJjZVZlcnRleCAhPSBjdXJWZXJ0ZXgpIAogICAgCXsKCQkJZG8KCSAgICAJewoJICAgICAgICAJbWFzLnB1c2hfYmFjayhjdXJWZXJ0ZXgpOwoJICAgICAgICAJcHJldlZlcnRleCA9IGdldFByZXZpb3VzVmVydGV4KHByZSwgY3VyVmVydGV4KTsKCSAgICAgICAgCWN1clZlcnRleCA9IHByZXZWZXJ0ZXg7CgkgICAgICAgIAltKys7CgkJIAl9IHdoaWxlIChjdXJWZXJ0ZXggIT0gc291cmNlVmVydGV4KTsKCQkgCW1hcy5wdXNoX2JhY2soY3VyVmVydGV4KTsKCQkJc2l6ZSA9IG1hcy5zaXplKCk7CgkJCWNvdXQgPDwgIkRpc3RhbmNlIHRvICIgPDwgbmFtZXNbbXlWZXJ0ZXhdIDw8ICI6ICIgPDwgRFtteVZlcnRleF0gPDwgIjsgUGF0aDogIjsKCQkJZm9yIChpbnQgaj1zaXplLTE7IGo+PTA7IGotLSkgCgkJCXsKCQkJCXRtcCA9IG1hc1tqXTsKCQkJCWlmKHNpemUtMSA9PSBqKSAKCQkJCXsKCQkJCQljb3V0IDw8IG5hbWVzW3RtcF07CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaW50IHByZXYgPSBtYXNbaisxXSwgbmV4dCA9IG1hc1tqXTsKCQkJCQljb3V0IDw8ICIgLSgiIDw8IGVkZ2VzW3ByZXZdW25leHRdIDw8ICIpLT4gIiA8PCBuYW1lc1t0bXBdOwoJCQkJfQoJCQkJbWFzLnBvcF9iYWNrKCk7CgkJCX0KCQkJY291dCA8PCBlbmRsOwoJCX0KCX0KfQog