版权声明:未经本人同意,禁止转载。 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;
}
}
}
}