最短路径算法,Dijkstra, Floyd 算法

Floyd方法真是简洁,时间复杂度是O(n^3),是所有顶点之间的最短路径

Dijkstra求的是源点到其它点之间的最短路径,如果要求所有点之间的最短路径,时间复杂度还是O(n^3)

const int maxint = 65535;
const int maxnum = 10;
int dist[maxnum];
int prev[maxnum];

int a[maxnum][maxnum];
void Dijkstra(int v0)
{
	bool s[maxnum];
	int n = maxnum;
	for(int i = 0; i <= n; i++)
	{
		dist[i] = a[v0][i];
		s[i] = false;
		if(dist[i] == maxint)
			prev[i] = -1;
		else
			prev[i] = v0;
	}
	dist[v0] = 0;
	s[v0] = true;
	for(int i = 2; i <= n; i++)
	{
		int mindist = maxint;
		int u = v0;
		for(int j = 1; j <= n; j++)
			if((!s[j]) && dist[j] < mindist)
			{
				u = j;
				mindist = dist[j];
			}
		s[u] = true;
		for(int j = 1; j <= n; j++)
				if((!s[j]) &&a[u][j] < maxint)
				{
					if(dist[u] + a[u][j] < dist[j])
					{
						dist[j] = dist[u] + a[u][j];
						prev[j] = u;
					}
				}
	}
}

void flod(mygraph t)
{
	int mat[num][num];
	int path[num][num];
	int n = t.nodes;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
		{
			mat[i][j] = t.edges[i][j];
			path[i][j] = j;
		}
	for(int k = 0; k < n; k++)
			for(int i = 0; i < n; i++)
				for(int j = 0; j < n; j++)
					if(mat[i][j] > (mat[i][k] + mat[k][j]))
					{
						path[i][j] = k;
						mat[i][j] = mat[i][k] + mat[k][j];
					}
		
}






猜你喜欢

转载自blog.csdn.net/shidamowang/article/details/80529531