最短路径

对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。


迪杰斯特拉算法:

解决了从某个源点到其余各顶点的最短路径问题。此算法的时间复杂度是O(NxN)。

#define MAXVEX 9
#define INFINITY 65535
typedef int Patharc[MAXVEX];
typedef int ShortPathTable[MAXVEX];

void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D)
{
	int v, w, k, min;
	int final[MAXVEX];
	for (v = 0; v < G.numVertexes; v++)
	{
		(*D)[v] = G.arc[v0][v];
		(*P)[v] = 0;
		final[v] = 0;
	}
	(*D)[v0] = 0;
	final[v0] = 1;
	for (v = 1; v < G.numVertexes; v++)
	{
		min = INFINITY;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (*D)[w] < min)
			{
				min = (*D)[w];
				k = w;
			}
		}
		final[k] = 1;
		for (w = 0; w < G.numVertexes; w++)
		{
			if (!final[w] && (min + G.arc[k][w] < (*D)[w]))
			{
				(*D)[w] = min + G.arc[k][w];
				(*P)[w] = k;
			}
		}
	}
}

弗洛伊德算法:

解决了从所以顶点到所有顶点的最短路径问题。此算法的时间复杂度是O(NxNxN)。

typedef int Pathmatrix[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];


void ShortestPath_Floyd(MGraph G, Pathmatrix *P, ShortPathTable *D)
{
	int v, w, k;
	for (v = 0; v < G.numVertexes; v++)
		for (w = 0; w < G.numVertexes; w++)
		{
			(*D)[v][w] = G.matrix[v][w];
			(*P)[v][w] = w;
		}
	for (k = 0; k < G.numVertexes; k++)
		for (v = 0; v < G.numVertexes; v++)
			for (w = 0; w < G.numVertexes; w++)
			if ((*D)[v][k] + (*D)[k][w] < (*D)[v][w])
			{
				(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
				(*P)[v][w] = (*P)[v][k];
			} 
}

//打印无向网的所有顶点到所有顶点的最短路径
void PrintPath(MGraph G, Pathmatrix P, ShortPathTable D)
{
	int v, w, k;
	for (v = 0; v < G.numVertexes; v++)
		for (w = v+1; w < G.numVertexes; w++)
		{
			printf("v%d-v%d weight: %d", v, w, D[v][w]);
			k = (*P)[v][w];
			printf(" path: %d", v);
			while (k != w)
			{
				printf(" -> %d", k);
				k = (*P)[v][w];
			}
			printf("\n");
		}
		printf("\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值