/*
最短路径——Floyd邻接矩阵(有向网或无向网)
Floyd算法允许图中有带负权值的边,但不允许有包含负权值的回路;
算法时间复杂度:O(n^3);
#include<string.h>
#define INF 99999999
#define MAX 50
int map[MAX][MAX];
int A[MAX][MAX]; //存最短距离
int path[MAX][MAX]; //存每个最小路径中,路径中的点的前一个点
void Floyd(){
int i,j,k;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
A[i][j] = map[i][j];
if(i != j && A[i][j]<INF)
path[i][j] = i;
else
path[i][j] = -1;
}
}
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++){
if(k==i || k==j)
continue;
if(A[i][k] + A[k][j] < A[i][j]){
A[i][j] = A[i][k] + A[k][j];
path[i][j] = path[k][j];
}
}
}
//输出任意两个点之间的最小路径,及路径上的各个点
void Output(){
int shortest[MAX];
int k,count;
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++){
if(i == j)
continue;
printf("%d=>%d %d ",i,j,A[i][j]);
memset(shortest, 0, sizeof(shortest));
count = 0;
shortest[count] = j;
while(path[i][shortest[count]] != i){
count++;
shortest[count] = path[i][shortest[count-1]];
}
shortest[++count] = i;
for(k=count; k>0; k--)
printf("%d->",shortest[k]);
printf("%d\n",shortest[k]);
}
}
int main(){
int i,j;
int m,u,v,w;
while(scanf("%d%d",&n,&m) && (n+m)){
for(i=0; i<n; i++)
for(j=0; j<n; j++){
map[i][j] = INF;
if(i == j)
map[i][j] = 0;
if(map[u][v] && w <map[u][v])
map[u][v] = w;
}
Floyd();
}
/*
4 9
0 1 1
0 3 4
1 2 9
1 3 2
2 0 3
2 1 5
2 3 8
3 2 6
2 0 5
*/
最短路径——Floyd邻接矩阵(有向网或无向网)
Floyd算法允许图中有带负权值的边,但不允许有包含负权值的回路;
算法时间复杂度:O(n^3);
*/
//代码如下:
#include<stdio.h>#include<string.h>
#define INF 99999999
#define MAX 50
int map[MAX][MAX];
int A[MAX][MAX]; //存最短距离
int path[MAX][MAX]; //存每个最小路径中,路径中的点的前一个点
int n;
void Floyd(){
int i,j,k;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
A[i][j] = map[i][j];
if(i != j && A[i][j]<INF)
path[i][j] = i;
else
path[i][j] = -1;
}
}
for(k=0; k<n; k++)
for(i=0; i<n; i++)
for(j=0; j<n; j++){
if(k==i || k==j)
continue;
if(A[i][k] + A[k][j] < A[i][j]){
A[i][j] = A[i][k] + A[k][j];
path[i][j] = path[k][j];
}
}
}
//输出任意两个点之间的最小路径,及路径上的各个点
void Output(){
int shortest[MAX];
int k,count;
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++){
if(i == j)
continue;
printf("%d=>%d %d ",i,j,A[i][j]);
memset(shortest, 0, sizeof(shortest));
count = 0;
shortest[count] = j;
while(path[i][shortest[count]] != i){
count++;
shortest[count] = path[i][shortest[count-1]];
}
shortest[++count] = i;
for(k=count; k>0; k--)
printf("%d->",shortest[k]);
printf("%d\n",shortest[k]);
}
}
int main(){
int i,j;
int m,u,v,w;
while(scanf("%d%d",&n,&m) && (n+m)){
for(i=0; i<n; i++)
for(j=0; j<n; j++){
map[i][j] = INF;
if(i == j)
map[i][j] = 0;
}
while(m--){
scanf("%d%d%d",&u,&v,&w);if(map[u][v] && w <map[u][v])
map[u][v] = w;
}
Floyd();
Output();
}
return 0;}
/*
4 9
0 1 1
0 3 4
1 2 9
1 3 2
2 0 3
2 1 5
2 3 8
3 2 6
2 0 5
*/