java dijkstra算法代码_Dijkstra算法的完整实现版本之算法的源代码收藏(转)

输入格式:

52sadttrwydfywaui873yuiaiud7dsnkmvxhvad5v.jpg

输出格式:

53jaygsdyg2yg76rwgdasm98a9801bbdsf76.jpg

输入时,将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

{

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

{

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

{

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)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=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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值