DIJKSTRA最短路径算法

这个也是最短路径算法,在严巍敏的书上也有提到过,具体的思想忘记了,(老了*0*)和FLOYD算法做个对照,记得他们各有优缺点,一个是从全局出发,一个是从局部生成的。很强大的算法。

C代码如下:

#include<stdio.h> 
#define INF 32767 
#define FALSE 0 
#define TRUE 1 
#define MAXN 8 
typedef int AdjMatrix[MAXN][MAXN];
typedef struct {
	int vexnum;
	AdjMatrix Arcs;
}
Graph;
void printD(double D[]);
void printP(int P[][MAXN]);
void ShortestPath(Graph G,int v0,double dist[],int path[][MAXN]) {
	int i,j,u,w;
	int s[MAXN];
	double min;
	for (i=0;i<G.vexnum;i++) {
		dist=G.Arcs[v0];
		s=0;
		if(dist<INF) path[0]=v0;
	}
	path[v0][1]=v0;
	s[v0]=1;
	dist[v0]=0;
	for (i=0;i<G.vexnum;i++) {
		min=INF;
		u=v0;
		for (j=0;j<G.vexnum;j++) 
		        if(s[j]==0&&dist[j]<min) {
			min=dist[j];
			u=j;
		}
		s=1;
		for (w=0;path[w]>-1&&w<G.vexnum;w++);
		if(path[w-1]!=u)path[w]=u;
		for (j=0;j<G.vexnum;j++) if(s[j]==0&&min+G.Arcs[j]<dist[j]) {
			dist[j]=min+G.Arcs[j];
			for (w=0;w<G.vexnum;w++)path[j][w]=path[w];
			for (w=0;path[j][w]!=-1&&w<G.vexnum;w++);
			path[j][w]=j;
		}
		//if
	}
	//for
}
void printD(double D[]) {
	int i;
	printf("/n");
	for (i=0;i<MAXN;i++) {
		printf("%1.1f/t",*(D+i));
	}
}
void printP(int P[][MAXN]) {
	int i,j;
	printf("/n");
	for (i=0;i<MAXN;i++) {
		printf("/n");
		for (j=0;j<MAXN;j++) printf("%d/t",P[j]);
	}
}
void InitP(int P[][MAXN]) {
	int i,j;
	for (i=0;i<MAXN;i++) for (j=0;j<MAXN;j++) P[j]=-1 ;
}
void main() {
	Graph G;
	FILE *fp;
	int i,j;
	double D[MAXN]= {
		0
	}
	;
	int P[MAXN][MAXN];
	InitP(P);
	G.vexnum=MAXN;
	fp=fopen("Dijkstra.dat","r");
	if(!fp)
	    printf("/nFILE OPEN ERROR!"); 
    else
	    printf("/nFILE OPEN SUCCESS!");
	for (i=0;i<MAXN;i++)
	    for (j=0;j<MAXN;j++) 
            fscanf(fp,"%d",&G.Arcs[j]);
	ShortestPath(G,0,D,P);
	printf("%d",G.vexnum);
	printD(D);
	printP(P);
	getch();
}

原创地址:DIJKSTRA最短路径算法_轩辕寒星的专栏-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值