//实验4.2:用迪杰斯特拉算法求赋权图中的最短路径(无向图)
#include <stdio.h>
#include <stdlib.h>
#define max 2000
typedef struct MGraph{
int matrix[max][max];//邻接矩阵
int vernum; //节点数目
}MGraph;
int P[max];
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 FindShort(MGraph *G,int *D,int vi){
int i,j,s[max];
for(i = 0;i < G->vernum;i++)
{
if(G->matrix[vi][i] != 10000)
{
P[i] = vi;
}
D[i] = G->matrix[vi][i];
s[i] = 0;
}
s[vi] = 1; //源点
//采用迪杰斯特拉算法
for(i = 0;i < G->vernum;i++)
{
//找到距离最近的点
int min,n;
min = 10000;
n = -1;
for(j = 0;j < G->vernum;j++)
{
if(s[j]==0 && D[j] < min)
{
min = D[j];
n = j;
}
}
if(n == -1)
{
break;
}
else
{
s[n] = 1;
}
//更新得距离
for(j = 0;j < G->vernum;j++)
{
if(s[j] != 1 && D[j] > D[n] + G->matrix[n][j])
{
D[j] = D[n] + G->matrix[n][j];
P[j] = n;
}
}
}
}
void Print(MGraph *G,int vi,int vj){
int i,mid=vj,th[max];
for(i=0;;i++)
{
if(mid == vi)
{
th[i] = vi;
break;
}
else
{
th[i] = mid;
mid = P[mid];
}
}
for(;i>=0;i--)
{
printf("%d\n",th[i]);
}
}
int main(){
MGraph *g;
int i,*dist,vi,vj;
g = (MGraph*)malloc(sizeof(MGraph));
g->vernum = 0;
InitMGraph(g);
dist = (int*)malloc(g->vernum * sizeof(int));
scanf("%d %d",&vi,&vj);
FindShort(g,dist,vi);
Print(g,vi,vj);
return 0;
}
noj 实验4.2:用迪杰斯特拉算法求赋权图中的最短路径(无向图)
最新推荐文章于 2022-05-30 16:32:34 发布