#include<iostream>
#include<cstring>
#include<queue>
const int INF=0x3f3f3f;
using namespace std;
int g[1000][1000];
int path[1000][1000];
int n,m;
int s,t;
void print()
{
printf("Path: %d", s);
int cur = s;
while (cur != t) {
cur = path[cur][t];
printf("-->%d", cur);
}
printf("\n");
}
void Floyd()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
if(g[i][k]!=INF)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]>g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
path[i][j]=path[i][k];
}
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,v;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
g[i][j]=INF;
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
g[x][y]=min(g[x][y],v);
path[x][y]=y;
}
Floyd();
while (scanf("%d %d", &s, &t)) {
if (s == -1 && t == -1) break;
printf("From %d to %d :\n", s, t);
print();
printf("Total cost : %d\n\n", g[s][t]);
}
}
打印全路径
#include<iostream>
#include<cstring>
#include<queue>
const int INF=0x3f3f3f;
using namespace std;
int g[1000][1000];
int path[1000][1000];
int n,m;
int s,t;
void print()
{
printf("v%d ",s);
int cur = s;
while (cur != t) {
cur = path[cur][t];
printf("v%d ", cur);
}
printf("\n");
}
void Floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
if(g[i][k]!=INF)
{
for(int j=0;j<n;j++)
{
if(g[i][j]>g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
path[i][j]=path[i][k];
}
}
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,y,v;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
g[i][j]=INF;
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
g[x][y]=min(g[x][y],v);
path[x][y]=y;
}
Floyd();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) continue;
s=i;
t=j;
printf("%d ", g[s][t]);
print();
}
}
/* while (scanf("%d %d", &s, &t)) {
if (s == -1 && t == -1) break;
printf("From %d to %d :\n", s, t);
print();
printf("Total cost : %d\n\n", g[s][t]);
}
*/
}