#include <stack>
#include <stdio.h>
using namespace std;
int N, M;
int warn;
const int MAX = 999;
#define line 20
void floydWarsheep(int path[][line], int map[][line], int n)
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
if (i == j)
path[i][j] = 0;
else if (map[i][j] < MAX)
path[i][j] = i;
else
path[i][j] = 0;
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (map[i][k] + map[k][j] < map[i][j])
{
map[i][j] = map[i][k] + map[k][j];
path[i][j] = k;
}
}
void printpath(int start, int end, int path[][line]) {
stack<int> s;
s.push(end);
int k = path[start][end];
while (k != start) {
s.push(k);
k = path[start][k];
}
s.push(start);
while (!s.empty()) {
int top = s.top();
printf("%d ", top - 1);
s.pop();
}
printf("\n\n");
}
int main(void) {
int map[line][line];
int path[line][line];
warn = scanf("%d", &N);
warn = scanf("%d", &M);
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++)
{
map[i][j] = MAX;
}
map[i][i] = 0;
}
for (int i = 0; i < M; i++)
{
int a, b, c;
warn = scanf("%d%d%d", &a, &b, &c);
map[a+1][b+1] = c;
}
floydWarsheep(path, map, N);
int times;
warn = scanf("%d", ×);
for (int i = 0; i < times; i++) {
int nodeA, nodeB;
warn = scanf("%d%d", &nodeA, &nodeB);
printf("%d\n", map[nodeA + 1][nodeB + 1]);
printpath(nodeA + 1, nodeB + 1, path);
}
return 0;
}
赏金猎人向您问好