求dijkstra算法的C实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求dijkstra算法的C实现相关的知识,希望对你有一定的参考价值。

这是我们的作业,可我不太会做,想找高手帮忙设计这个程序。
要求很简单:任意结点数无向不加权图的dijkstra最短路径实现,能读入所给的.txt文件(邻接矩阵)并输出所有结点间的最短路径。
请好心人帮忙~~~
急!
谢谢!

输入时,将s,t,x,y,z五个点按照1,2,3,4,5起别名,输入格式按照下图例所示
当提示Please enter the vertex where Dijkstra algorithm starts:时输入算法的起始点
比如计算结果v1v4v2表示从点1到点2经过1,4,2为最短路径
Dijkstra算法的完整实现版本,算法的源代码
/* Dijkstra.c

Copyright (c) 2002, 2006 by ctu_85
All Rights Reserved.
*/
#include "stdio.h"
#include "malloc.h"
#define maxium 32767
#define maxver 9 /*defines the max number of vertexs which the programm can handle*/
#define OK 1
struct Point

char vertex[3];
struct Link *work;
struct Point *next;
;
struct Link

char vertex[3];
int value;
struct Link *next;
;
struct Table /*the workbannch of the algorithm*/

int cost;
int Known;
char vertex[3];
char path[3];
struct Table *next;
;
int Dijkstra(struct Point *,struct Table *);
int PrintTable(int,struct Table *);
int PrintPath(int,struct Table *,struct Table *);
struct Table * CreateTable(int,int);
struct Point * FindSmallest(struct Table *,struct Point *);/*Find the vertex which has the smallest value reside in the table*/
int main()

int i,j,num,temp,val;
char c;
struct Point *poinpre,*poinhead,*poin;
struct Link *linpre,*linhead,*lin;
struct Table *tabhead;
poinpre=poinhead=poin=(struct Point *)malloc(sizeof(struct Point));
poin->next=NULL;
poin->work=NULL;
restart:
printf("Notice:if you wanna to input a vertex,you must use the format of number!\n");
printf("Please input the number of points:\n");
scanf("%d",&num);
if(num>maxver||num<1||num%1!=0)

printf("\nNumber of points exception!");
goto restart;

for(i=0;i<num;i++)

printf("Please input the points next to point %d,end with 0:\n",i+1);
poin=(struct Point *)malloc(sizeof(struct Point));
poinpre->next=poin;
poin->vertex[0]='v';
poin->vertex[1]='0'+i+1;
poin->vertex[2]='\0';
linpre=lin=poin->work;
linpre->next=NULL;
for(j=0;j<num-1;j++)

printf("The number of the %d th vertex linked to vertex %d:",j+1,i+1);
scanf("%d",&temp);
if(temp==0)

lin->next=NULL;
break;

else

lin=(struct Link *)malloc(sizeof(struct Link));
linpre->next=lin;
lin->vertex[0]='v';
lin->vertex[1]='0'+temp;
lin->vertex[2]='\0';
printf("Please input the value betwixt %d th point towards %d th point:",i+1,temp);
scanf("%d",&val);
lin->value=val;
linpre=linpre->next;
lin->next=NULL;


poinpre=poinpre->next;
poin->next=NULL;

printf("Please enter the vertex where Dijkstra algorithm starts:\n");
scanf("%d",&temp);
tabhead=CreateTable(temp,num);
Dijkstra(poinhead,tabhead);
PrintTable(temp,tabhead);
return OK;

struct Table * CreateTable(int vertex,int total)

struct Table *head,*pre,*p;
int i;
head=pre=p=(struct Table *)malloc(sizeof(struct Table));
p->next=NULL;
for(i=0;i<total;i++)

p=(struct Table *)malloc(sizeof(struct Table));
pre->next=p;
if(i+1==vertex)

p->vertex[0]='v';
p->vertex[1]='0'+i+1;
p->vertex[2]='\0';
p->cost=0;
p->Known=0;

else

p->vertex[0]='v';
p->vertex[1]='0'+i+1;
p->vertex[2]='\0';
p->cost=maxium;
p->Known=0;

p->next=NULL;
pre=pre->next;

return head;

int Dijkstra(struct Point *p1,struct Table *p2) /* Core of the programm*/

int costs;
char temp;
struct Point *poinhead=p1,*now;
struct Link *linna;
struct Table *tabhead=p2,*searc,*result;
while(1)

now=FindSmallest(tabhead,poinhead);
if(now==NULL)
break;
result=p2;
result=result->next;
while(result!=NULL)

if(result->vertex[1]==now->vertex[1])
break;
else
result=result->next;

linna=now->work->next;
while(linna!=NULL) /* update all the vertexs linked to the signed vertex*/

temp=linna->vertex[1];
searc=tabhead->next;
while(searc!=NULL)

if(searc->vertex[1]==temp)/*find the vertex linked to the signed vertex in the table and update*/

if((result->cost+linna->value)<searc->cost)

searc->cost=result->cost+linna->value;/*set the new value*/
searc->path[0]='v';
searc->path[1]=now->vertex[1];
searc->path[2]='\0';

break;

else
searc=searc->next;

linna=linna->next;


return 1;

struct Point * FindSmallest(struct Table *head,struct Point *poinhead)

struct Point *result;
struct Table *temp;
int min=maxium,status=0;
head=head->next;
poinhead=poinhead->next;
while(head!=NULL)

if(!head->Known&&head->cost<min)

min=head->cost;
result=poinhead;
temp=head;
status=1;

head=head->next;
poinhead=poinhead->next;

if(status)

temp->Known=1;
return result;

else
return NULL;

int PrintTable(int start,struct Table *head)

struct Table *begin=head;
head=head->next;
while(head!=NULL)

if((head->vertex[1]-'0')!=start)
PrintPath(start,head,begin);
head=head->next;

return OK;

int PrintPath(int start,struct Table *head,struct Table *begin)

struct Table *temp=begin->next,*p,*t;
p=head;
t=begin;
if((p->vertex[1]-'0')!=start&&p!=NULL)

while(temp->vertex[1]!=p->path[1]&&temp!=NULL)
temp=temp->next;
PrintPath(start,temp,t);
printf("%s",p->vertex);

else
if(p!=NULL)
printf("\n%s",p->vertex);
return OK;
参考技术A #include <stdlib.h>
#define INF 1000000000
#define MAXV 200

typedef struct Graph
int n;
int w[MAXV][MAXV];
;

int d[MAXV];
int pre[MAXV];

void init_single_source(Graph *G,int s)
for (int i=0;i<G->n;i++)
d[i]=INF;
pre[i]=-1;

d[s]=0;


void relax(int u,int v,Graph *G)
if (d[v]>d[u]+G->w[u][v])
d[v]=d[u]+G->w[u][v];
pre[v]=u;



int dijkstra(Graph *G,int s)
init_single_source(G,s);
int S[MAXV],i,j,u,min;
for (i=0;i<G->n;i++) S[i]=0;
for (i=0;i<G->n;i++)
min=INF;
u=-1;
for (j=0;j<G->n;j++) if (S[j]==0 && d[j]<min)
u=j;
min=d[j];

S[u]=-1;
for (j=0;j<G->n;j++) if (S[j]==0) relax(u,j,G);

以上是关于求dijkstra算法的C实现的主要内容,如果未能解决你的问题,请参考以下文章

java代码实现Dijkstra算法求图的最短路径

求大佬用java帮我实现dijkstra算法,单源最短路径

C语言实现Dijkstra算法

Dijkstra算法及其C++实现

Dijkstra算法及其C++实现

最短路径算法(Dijkstra)