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

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;
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值