无环图的最短路和最长路径

版权声明:未经本人同意,禁止转载。 https://blog.csdn.net/qq_34022601/article/details/84327611

1.DAG最短路(基于拓扑排序优化的Dijkstra算法)

拓扑排序给予了我们查找顺序的正确性,也减少了不必要的查找.

(1)先对路径长度数组初始化,源点为0,其余为无穷大(这里用100000代替)。

(2)对图进行遍历,因为有n个点,外部循环n次。每个点e个边内部循环e次(复杂度O(N+E))。按照拓扑排序进行遍历。

第一个点必然是源点,对从源点的每一个邻接顶点进行更新。

第二个点必然是邻接源点的点,在第一次的基础上,对第二个点所邻接的点再次更新。

举例:

void Shortest(int *top,int n,int start,int *path)
{
	/*top 数组放置了topsort后的顶点顺序*/
	TopSort(n,top);
	int w[MAX_N];	// 	表示从源点到图内点 v 的最短路径 
	for (int i=1;i<=n;i++)
	{
		if (i==start)
			w[i]=0;
		else
			w[i]=100000;
	}
	for (int i=1;i<=n;i++)
	{
		int v=top[i];
		vector <int> :: iterator it;//用vector表示邻接表
		// G[v].adj 表示邻接表 
		for (it=G[v].adj.begin();it!=G[v].adj.end();it++)
		{
			if (w[*it]>w[v]+W[start][*it])
			{
				w[*it]=w[v]+W[start][*it];
				path[*it]=v;
			}
		}
	}
}

2.DAG最长路径(分析关键路径)

一般图求最长路径是毫无意义的,因为可能存在正值圈。但是DAG图没有回路,可以让我们求出最长路径。

求解方法实际上是与求最短路径是类似的,不过路径数组初始化为负无穷大而已。

void Longest(int *top,int n,int start,int *path)
{
	TopSort(n,top);
	int w[MAX_N];	// 	表示从源点到图内点 v 的最短路径 
	for (int i=1;i<=n;i++)
	{
		if (i==start)
			w[i]=0;
		else
			w[i]=-100000;
	}
	for (int i=1;i<=n;i++)
	{
		int v=top[i];
		vector <int> :: iterator it;
		for (it=G[v].adj.begin();it!=G[v].adj.end();it++)
		{
			if (w[*it]<w[v]+W[start][*it])
			{
				w[*it]=w[v]+W[start][*it];
				path[*it]=v;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_34022601/article/details/84327611