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