图-----求最短路径(Dijkstra算法)

原理:对于源顶点v0,首先选择其直接相邻的顶点中长度最短的顶点vi,那么根据已知可得,v0经过vi到达与vi直接相邻的顶点vj的最短距离 dist[j] 为 matrix[v0][j] 与 dist[i] + matrix[i][j] 中的最小值,即dist[j] =min{ matrix[v0][j] , dist[i] + matrix[i][j] }.

typedef struct node
{
	int matrix[N][M];
	int n;
	int e;
}MGraph;

void DijkstraPath(MGraph g, int*dist, int*path, int v0)
{
	int i, j, k;
	bool *visited = (bool*)malloc(sizeof(bool)*g.n);
	for (i = 0;i < g.n;++i)
	{
		if (g.matrix[v0][i] > 0 && i != v0)
		{
			dist[i] = g.matrix[v0][i];
			path[i] = v0;
		}
		else
		{
			dist[i] = INT_MAX;
			path[i] = -1;
		}
		visited[v0] = false;
		path[v0] = v0;
		dist[v0] = 0;
	}
	visited[v0] = true;
	for (i = 1;i < g.n;++i)
	{
		int min = INT_MAX;
		int u;
		for (j = 0;j < g.n;++j)
		{
			if (visited[j] == false && dist[j] < min)
			{
				min = dist[j];
				u = j;
			}
		}
		visited[u] = true;
		for (k = 0;k < g.n;++k)
		{
			if (visited[k] == false && g.matrix[u][k] > 0 && min + g.matrix[u][k] < dist[k])
			{
				dist[k] = min + g.matrix[u][k];
				path[k] = u;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81813356