//floyd 算法 带输出路劲
#include<stdio.h>
#include<iostream>
#define inf 0xFFFFFFF
using namespace std;
const int maxn=100005;
int n,dp[maxn][maxn],path[maxn][maxn];//floyd算法利用的是动态规划的思想。
//也是可以求解矩阵的最值
void init()//求解最小或者最短时的初始值
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) dp[i][j]=0;
else dp[i][j]=inf;
path[i][j]=0;
}
}
/*void init()//求解最大或者最长时的初始值
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
dp[i][j]=-1;
path[i][j]=0;
}
}8*/
int floyd()
{
init();
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(dp[i][k]!=-1 && dp[k][j]!=-1 && dp[i][k]+dp[k][j]>dp[i][j])//此为求最大值时
{
dp[i][j]=dp[i][k]+dp[k][j];
path[i][j]=k;//记录路劲 第一种记录路劲
path[i][j] = path[i][k];//第二种记录路径
}
/*if(dp[i][k]!=inf && dp[k][j]!=inf && dp[i][k]+dp[k][j]<dp[i][j])//此为求最小值时,这里注意溢出 可以增加判断
{
dp[i][j]=dp[i][k]+dp[k][j];
path[i][j]=k;//记录路劲 第一种记录路劲
}*/
return 0;
}
void output(int i,int j)//第一种打印路径
{
if(i==j) return ;
if(path[i][j]==0) printf("%d ",j);//如果爆栈 那么怎么做?
else
{
output(i,path[i][j]);
output(path[i][j],j);
}
}
void output(int src,int des)//第二种输出路径
{
int u=src;
printf("%d",u);
while(u!=des)
{
printf("-->%d",path[u][des]);
u=path[u][des];
}
}
int main()
{
int x,y,da,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&da);
dp[x][y]=da;
}
floyd();
scanf("%d%d",&x,&y);
printf("the min path %d",dp[x][y]);
output(x,y);
return 0;
}
//floyd 算法 带输出路劲
#include<stdio.h>
#include<iostream>
#define inf 0xFFFFFFF
using namespace std;
const int maxn=100005;
int n,dp[maxn][maxn],path[maxn][maxn];//floyd算法利用的是动态规划的思想。
//也是可以求解矩阵的最值
void init()//求解最小或者最短时的初始值
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) dp[i][j]=0;
else dp[i][j]=inf;
path[i][j]=0;
}
}
/*void init()//求解最大或者最长时的初始值
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
dp[i][j]=-1;
path[i][j]=0;
}
}8*/
int floyd()
{
init();
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(dp[i][k]!=-1 && dp[k][j]!=-1 && dp[i][k]+dp[k][j]>dp[i][j])//此为求最大值时
{
dp[i][j]=dp[i][k]+dp[k][j];
path[i][j]=k;//记录路劲 第一种记录路劲
path[i][j] = path[i][k];//第二种记录路径
}
/*if(dp[i][k]!=inf && dp[k][j]!=inf && dp[i][k]+dp[k][j]<dp[i][j])//此为求最小值时,这里注意溢出 可以增加判断
{
dp[i][j]=dp[i][k]+dp[k][j];
path[i][j]=k;//记录路劲 第一种记录路劲
}*/
return 0;
}
void output(int i,int j)//第一种打印路径
{
if(i==j) return ;
if(path[i][j]==0) printf("%d ",j);//如果爆栈 那么怎么做?
else
{
output(i,path[i][j]);
output(path[i][j],j);
}
}
void output(int src,int des)//第二种输出路径
{
int u=src;
printf("%d",u);
while(u!=des)
{
printf("-->%d",path[u][des]);
u=path[u][des];
}
}
int main()
{
int x,y,da,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&da);
dp[x][y]=da;
}
floyd();
scanf("%d%d",&x,&y);
printf("the min path %d",dp[x][y]);
output(x,y);
return 0;
}