#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
//floyd实现
int** floyd(int **matrix, int n){
for(int k = 0;k < n;k++){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(matrix[i][k]!= INT_MAX && matrix[k][j]!=INT_MAX
&& matrix[i][k] + matrix[k][j]< matrix[i][j]){
matrix[i][j] = matrix[i][k] + matrix[k][j];
}
}
}
}
return matrix;
}
int main(){
int **matrix;
int Npoint,n;
cout<<"number(point):";
cin>>Npoint;
matrix = (int **)malloc(n*sizeof(int *));
for(int i = 0;i<Npoint;i++){
matrix[i] = (int *)malloc(sizeof(int)*Npoint);
for(int j = 0;j<Npoint;j++){
matrix[i][j] = INT_MAX;
}
matrix[i][i] = 0;
}
cout<<"number(edge):";
cin>>n;
cout<<"edge || format: val edgeBegin edgeEnd:"<<endl;
int val,edgeB,edgeE;
for(int i = 0;i<n;i++){
cin>>val>>edgeB>>edgeE;
matrix[edgeB][edgeE] = val;
}
matrix = floyd(matrix,Npoint);//floyd
for(int i = 0;i<Npoint;i++){
for(int j = 0;j<Npoint;j++){
cout<<setw(5)<<matrix[i][j];
}
cout<<endl;
}
free(matrix);
return 0;
}