#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 1005
#define INF 0x3f3f3f3f
using namespace std;
int m, n;
int map[N][N];
void init()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j) map[i][j] = 0;
else map[i][j] = INF;
}
}
}
void creatgraph()
{
int t1, t2, t3;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &t1, &t2, &t3);//两个顶点和权值
if(map[t1][t2] > t3)//防止出现多次输入相同的两点,取最小值****一定注意
map[t1][t2] = t3;//有向图
}
}
void floyed()
{
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] < INF && map[k][j] < INF)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}
}
}
}
void print()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
printf("%10d ", map[i][j]);
printf("\n");
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)//n个顶点,m条边
{
init();//初始化地图
creatgraph();//建图
floyed();//核心弗洛伊德算法
print();//输出最短路结果
}
return 0;
}
下边为打印路径的模板
/*floyd算法,打印路径模板*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#define N 1005
#define INF 0x3f3f3f3f
using namespace std;
int mapp[N][N], path[N][N];//path[i][j]的含义:从i到j的路径中,i的下一个点。
int n,m;//顶点数,边数
void init()
{
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
{
if (i == j) mapp[i][j] = 0;
else mapp[i][j] = INF;
}
}
void floyd()
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= N; ++j)
{
if (mapp[i][j] == INF) path[i][j] = -1;//i不能直接到j
else path[i][j] = j;//i到j路径的下一个点为j
}
}
int i, j, k;
for (k = 1; k <= n; k++)
{
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (mapp[i][k] < INF && mapp[k][j] < INF && mapp[i][j] > mapp[i][k] + mapp[k][j])
{
mapp[i][j] = mapp[i][k] + mapp[k][j];
path[i][j] = path[i][k];//从i到j的下一个顶点为i到k的下一个顶点
}
}
}
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
int a, b, c;
init();
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
mapp[a][b] = mapp[b][a] = c;//无向图
}
floyd();
//打印路径
int T, start, end;
scanf("%d", &T);
while (T--)
{
scanf("%d%d",&start, &end);
int tmp = start;
cout << start;
while (tmp != end)
{
cout << "-->" << path[tmp][end];
tmp = path[tmp][end];
}
cout << endl;
cout << "cost: " << mapp[start][end] << endl;
}
}
return 0;
}