// 4.4 弗洛伊德算法求赋权图的两点间的最短路径
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define max 10000
typedef struct MGraph
{
int matrix[max][max];
int vernum;
}MGraph;
int **P;
int **D;
//
int** MemoryMalloc(int S,int **M){
M = (int**)malloc(S*sizeof(int*));
for(int i = 0;i < S;i++)
{
M[i] = (int*)malloc(S*sizeof(int));
}
return M;
}
//
void MemoryFree(int S,int **M){
for(int i = 0;i < S;i++)
{
free(M[i]);
}
free(M);
}
void InitMGraph(MGraph *G){
scanf("%d",&G->vernum);
int i,j;
for(i = 0;i < G->vernum;i++)
{
for(j = 0;j < G->vernum;j++)
{
scanf("%d",&G->matrix[i][j]);
}
}
}
void Floyd(MGraph *G){
int i,j,k,s[max];
/* 初始化距离数组和前置节点 */
for(i = 0;i < G->vernum;i++)
{
for(j = 0;j < G->vernum;j++)
{
D[i][j] = G->matrix[i][j];
if(D[i][j] != 10000)
{
P[i][j] = i;
}
}
}
/* 弗洛伊德算法 */
//初始化可选中间节点集
for(i = 0;i < G->vernum;i++)
{
s[i] = 0;
}
//添加节点
for(i = 0;i < G->vernum;i++)
{
//更新距离矩阵和前置矩阵
s[i] = 1;
for(j = 0;j < G->vernum;j++)
{
for(k = 0;k < G->vernum;k++)
{
if(D[j][k] > D[j][i] + D[i][k])
{
D[j][k] = D[j][i] + D[i][k];
P[j][k] = i;
}
}
}
}
}
void Print(MGraph *G,int vi,int vj){
if(D[vi][vj] >= 10000)
{
//printf("不可达");
}
else
{
int th[max];
int mid = vj;
int i = 0;
for(;;i++){
if(mid == vi)
{
th[i] = mid;
break;
}
else
{
th[i] = mid;
mid = P[vi][mid];
}
}
for(;i>=0;i--)
{
printf("%d\n",th[i]);
}
}
}
int main(){
MGraph *g;
g = (MGraph*)malloc(sizeof(MGraph));
P=NULL;
D=NULL;
InitMGraph(g);
P = MemoryMalloc(g->vernum,P);
D = MemoryMalloc(g->vernum,D);
Floyd(g);
int *a,vi[max],vj[max],n = 0;
scanf("%d",&n);
a = (int*)malloc(sizeof(int));
for(int i = 0;i < n;i++)
{
scanf("%d %d",&vi[i],&vj[i]);
}
for(int i = 0;i < n;i++)
{
Print(g,vi[i],vj[i]);
}
MemoryFree(g->vernum,P);
MemoryFree(g->vernum,D);
return 0;
}
noj 4.4 弗洛伊德算法求赋权图的两点间的最短路径
最新推荐文章于 2022-05-27 17:30:25 发布