迪杰斯特拉算法

#include <stdio.h>
#include <stdlib.h>
#define MAX 20
#define INFINITY 65538

typedef int AdjMatrix[MAX][MAX];//存储图 
typedef int PathMatrix[MAX][MAX];//记录v0到各点的最短路径 
typedef int ShortPath[MAX];//辅助数组,记录最短距离 
typedef struct{
	int vexnum,arcnum;
	int visited[MAX];
	char vexs[MAX];
	AdjMatrix arcs;
	PathMatrix path;
	ShortPath flag;
}MGraph;

int LocateAdj(MGraph G, char v){//查找顶点的位置 
	int i;
	
	for(i = 0; i < G.vexnum; i ++){
		if(G.vexs[i] == v)
			return i;
	}
	return -1;
}

void CreateMGraph(MGraph &G){
	int i,j,k,cost;
	char v1,v2;
	
	for(i = 0; i < G.vexnum; i ++){
		for(j = 0; j < G.vexnum; j ++){
			G.arcs[i][j] = INFINITY;
		}
	}
	
	printf("请输入结点数以及边的数目:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	
	printf("请输入%d个结点:\n",G.vexnum);
	getchar();
	for(i = 0; i < G.vexnum; i ++)
		scanf("%c",&G.vexs[i]);
	
	printf("请输入%d条边以及权值:\n",G.arcnum);
	for(i = 0; i < G.arcnum; i ++){
		getchar();
		scanf("%c%c%d",&v1,&v2,&cost);
		
		j = LocateAdj(G,v1);	k = LocateAdj(G,v2);
		
		G.arcs[j][k] = cost;
	}
	
}

void ShortestPath_DIJ(MGraph &G, int v){//最短路径 
	int i,j,ans;
	
	for(i = 0; i < G.vexnum; i ++){
		G.visited[i] = 0;//标志数组,记录是否访问过该顶点 
		G.flag[i] = G.arcs[v][i];//初始化辅助数组 
		
		for(j = 0; j < G.vexnum; j ++)
			G.path[i][j] = 0;//初始化记录数组 
		
		ans = 1;
		
		if(G.flag[i] < INFINITY){//连通,改变path数组元素值 
			G.path[i][v] = ans;
			G.path[i][i] = ++ ans;
		}
	}
	G.visited[v] = 1;	G.flag[v] = 0;
	
	for(i = 1; i < G.vexnum; i ++){
		int min = INFINITY;
		
		for(j = 0; j < G.vexnum; j ++){//查找最小元素 
			if(!G.visited[j] && min > G.flag[j]){
				min = G.flag[j];
				v = j;
			}
		}
		G.visited[v] = 1;
		
		for(j = 0; j < G.vexnum; j ++){//修改,更新最小元素 
			if(G.arcs[v][j] + min < G.flag[j] && !G.visited[j]){
				G.flag[j] = G.arcs[v][j] + min;
				
				ans = 1;//用来标记访问的顺序; 
				
				for(int k = 0; k < G.vexnum; k ++){
					G.path[j][k] = G.path[v][k];//把上一组最小元素的一行赋值过来 
					
					if(G.path[v][k])
						ans ++;
				}
				G.path[j][j] = ans;		
			}
		}
	}
		
}

int main(){
	MGraph G;
	int i,j;
	
	CreateMGraph(G);
	
	ShortestPath_DIJ(G,0);
	
	for(i = 0; i < G.vexnum; i ++){
		for(j = 0; j < G.vexnum; j ++)
			printf("%d\t",G.path[i][j]);
		putchar('\n');
	} 
	
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值