最短路徑

對於網圖來說,最短路徑是指兩頂點之間經過的邊上權值之和最少的路徑,並且我們稱路徑上的第一個頂點是源點,最後一個頂點是終點。


迪傑斯特拉算法:

解決了從某個源點到其餘各頂點的最短路徑問題。此算法的時間複雜度是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");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章