Dijkstra最短路径算法

// Dijkstra.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#define MAX 100
#define INF 0x7ffff

typedef struct{
	int e;//边数
	int v;//顶点数
	int graph[MAX][MAX];
}MGraph;

void Ppath(int path[], int i, int v){
	int k;
	k = path[i];
	if (k == v)
	{
		return;
	}
	Ppath(path, k, v);
	printf("%d,", k);
}


void Dispatch(int dist[], int path[], int vset[], int n, int v){
	int i;
	for (size_t i = 0; i < n; i++)
	{
		if (vset[i] == 1){
			if (i!=v)
			{
				printf(" 从%d到%d的最短路径长度为:%-4d 路径为:", v, i, dist[i]);
				printf("%d,", v);
				Ppath(path, i, v);
				printf("%d\n", i);
			}
			else
			{
				printf("从%d 到 %d不存在路径\n", v, i);
			}
		}
	}
}
void Dijkstra(MGraph graph,int start){
	int path[MAX];//存放路径
	int vset[MAX];//vset[i]= 1表示已经加入S集合重,反之在U集合
	int dist[MAX];//存放从源点到vi目前的最短路径

	
	for (size_t i = 0; i < graph.v; i++)
	{
		if (graph.graph[start][i]<INF)
		{
			path[i] = start;
		}
		else
		{
			path[i] = -1;
		}
		dist[i] = graph.graph[start][i];
		
		vset[i] = 0;
	}
	vset[start] = 1; path[start] = 0;
	//找到权值最小的结点
	
	for (size_t i = 0; i < graph.v; i++)
	{
		int min = INF;
		int minid = -1;
		for (size_t j = 0; j < graph.v; j++)
		{
			if (min>dist[j] && vset[j] == 0)
			{
				min = dist[j];
				minid = j;
			}
		}
		vset[minid] = 1;
		for (size_t k = 0; k < graph.v; k++)
		{
			if (vset[k] == 0)
			{
				if (dist[k]>graph.graph[minid][k] + dist[minid] && graph.graph[minid][k]<INF){
					path[k] = minid;
					dist[k] = graph.graph[minid][k] + dist[minid];
				}
			}
			
		}
	}

	Dispatch(dist, path, vset, graph.v, 0);

}

int _tmain(int argc, _TCHAR* argv[])
{
	MGraph mGraph = {
		12,7,
		{
			{ 0, 4, 6, 6, INF, INF, INF },
			{ INF, 0, 1, INF, 7, INF, INF },
			{ INF, INF,0,INF,6,4,INF },
			{ INF, INF, 2, 0, INF, 5, INF },
			{ INF, INF, INF, INF, 0, INF, 6 },
			{ INF, INF, INF, INF, 1, 0, 8 },
			{ INF, INF, INF, INF, INF, INF }
		}
	};
	Dijkstra(mGraph, 0);
	_tsystem(_T("pause"));
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值