- 基本框架
- 代码实现
以下图为例,结点是0,1,2,3,4,5,6
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
#define MAXSIZE 10
#define MAX 11111
typedef struct GraphNode
{
ElementType data;
struct GraphNode* next;
}Graph;
int node_num;
int path[MAXSIZE];
int edge[MAXSIZE][MAXSIZE]={0};
int dist[MAXSIZE];
int collected[MAXSIZE];
void Dijkstra(Graph* G)
{
dist[0]=0;
while(1)
{
int min=11112;
int v=-1;
for(int i=0;i<node_num;i++)
{
if(dist[i]<min && collected[i]==0)
{
min=dist[i];
v=i;
}
}
if(v==-1) return;
collected[v]=1;
Graph* t=&G[v];
while(t->next)
{
int w=t->next->data;
if(collected[w]==0 && dist[v]+edge[v][w]<dist[w])
{
dist[w]=dist[v]+edge[v][w];
path[w]=v;
}
t=t->next;
}
}
}
int main(int argc, char** argv) {
Graph* G=(Graph*)malloc(MAXSIZE*sizeof(GraphNode));
int edge_num;
scanf("%d %d",&node_num,&edge_num);
for(int i=0;i<node_num;i++)
{
dist[i]=MAX;
path[i]=-1;
collected[i]=0;
G[i].data=i;
G[i].next=NULL;
}
for(int i=0;i<edge_num;i++)
{
int start,end,value;
scanf("%d %d %d",&start,&end,&value);
Graph* newG=(Graph*)malloc(sizeof(GraphNode));
newG->data=end;
newG->next=G[start].next;
G[start].next=newG;
edge[start][end]=value;
}
Dijkstra(G);
printf("**************\n");
for(int i=1;i<node_num;i++)
{
int location=i;
while(location!=-1)
{
printf("%d ",location);
location=path[location];
}
printf("\n");
}
return 0;
}
- 结果
解释一下这个结果:每一行都反着看
第1行是第结点0到结点1的最短路径:0–>1
第2行是第结点0到结点2的最短路径:0–>3–>2
第3行是第结点0到结点3的最短路径:0–>3
第4行是第结点0到结点4的最短路径:0–>3–>4
…
当然大家也可以把结果弄成正常到,把结果一个个压入栈,出栈的顺序就是正常最短路径顺序