#include <stdio.h>
#define INF 10000
#define N 8
int adj_mtx[N][N];
int pre[N];
int visited[N];
int v;
void set(int i, int j, int dist)
{
adj_mtx[i][j] = dist;
adj_mtx[j][i] = dist;
}
void init()
{
int i,j,k;
for(i=0;i<N;i++)
visited[i]=0;
visited[v]=1;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
adj_mtx[i][j]=INF;
set(v,v,0);
set(0,1,8);
set(0,2,3);
set(0,3,2);
set(1,4,3);
set(2,5,4);
set(3,6,5);
set(4,5,1);
set(5,6,2);
set(4,7,1);
set(5,7,3);
set(6,7,4);
for(i=0;i<N;i++)
pre[i]=0;
for(i=0;i<N;i++)
{
// if(i==v) continue;
if(adj_mtx[v][i]!=INF) pre[i]=v;
}
}
void dijikstra()
{
int min_dist=INF,min_index=-1;
int i,j,k;
for(i=0;i<N;i++)
{
min_dist=INF,min_index=-1;
for(j=0;j<N;j++)
if(!visited[j] && adj_mtx[v][j]<min_dist)
{
min_dist=adj_mtx[v][j];
min_index=j;
}
if(min_index!=-1)
{
visited[min_index]=1;
for(k=0;k<N;k++)
if(!visited[k] && adj_mtx[v][min_index]+adj_mtx[min_index][k]<adj_mtx[v][k])
{
adj_mtx[v][k]=adj_mtx[v][min_index]+adj_mtx[min_index][k];
pre[k]=min_index;
}
}
}
}
void output_path(int dest_node)
{
// printf("output_path destnode:%d\n"+dest_node);
if(v==dest_node)
{
printf("%d ",dest_node);
return ;
}
output_path(pre[dest_node]);
printf("%d ",dest_node);
}
void output_result()
{
int i;
for(i=0;i<N;i++)
{
printf("to node %d, min dist is:%d\n",i,adj_mtx[v][i]);
printf("path is:\n");
output_path(i);
printf("\n");
}
}
void output()
{
int i,j;
printf("\npre:\n\n");
for(i=0;i<N;i++)
printf("%d ",pre[i]);
printf("\n\nadj_mtx:\n\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%-5d ",adj_mtx[i][j]);
printf("\n");
}
}
int main()
{
v=0;
init();
dijikstra();
output_result();
//output();
return 0;
}
单源点最短路径
最新推荐文章于 2024-01-06 20:11:11 发布
本文介绍了一个基于Dijkstra算法的实现案例,通过C语言演示了如何寻找加权图中两点之间的最短路径。该程序定义了一个权重矩阵来表示图,并通过Dijkstra算法计算从指定起点到其他各点的最短距离及路径。
摘要由CSDN通过智能技术生成