关键路径:
我以为的关键路径就是:在一个AOE-网(带权的有向无环图)中,找到一条最长路径(可能不止一条)
相关术语:
这是样例输入:
9 11
1 2 6
1 3 4
1 4 5
2 5 1
3 5 1
4 6 2
5 7 9
5 8 7
6 8 4
7 9 2
8 9 4
样例输出:
代码:
//#include<bits/stdc++.h>
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<math.h>
#include<stack>
using namespace std ;
typedef long long ll;
#define MAXN 1005
#define INF 0x3f3f3f3f
#define MALL (BiTnode *)malloc(sizeof(BiTnode));
vector<int >g[MAXN];
int topo[MAXN]; //拓扑序列
int ru[MAXN]; //每个顶点的入度
int ve[MAXN];
int vl[MAXN];
int a[MAXN][MAXN]; //存图
int Topo(int n) //拓扑排序
{
int x=1;
for(int i=0; i<n; ++i)
{
for(int j=1; j<=n; ++j)
{
if(ru[j] == 0)
{
topo[x] = j;
x++;
ru[j] = -1;
for(int k=0; k<g[j].size(); ++k)
ru[g[j][k]]--;
break;
}
}
}
if(x == n+1)
return 1;
else
return 0;
}
void Criticalpath(int n) //关键路径
{
memset(ve, 0, sizeof(ve));
for(int i=1; i<=n; ++i)
{
int c = topo[i];
for(int k=0; k<g[c].size(); ++k) //求最早发生时间ve
{
if(ve[g[c][k]] < ve[c]+ a[c][g[c][k]])
ve[g[c][k]] = ve[c]+ a[c][g[c][k]];
}
}
for(int i=1; i<=n; ++i)
vl[i] = ve[n];
for(int i=n; i>0; --i) //求最迟发生时间
{
int c = topo[i];
for(int k=0; k<g[c].size(); ++k)
{
if(vl[c] > vl[g[c][k]] - a[c][g[c][k]])
vl[c] = vl[g[c][k]] - a[c][g[c][k]];
}
}
for(int i=1; i<=n; ++i)
{
for(int j=0; j<g[i].size(); ++j)
{
int e = ve[i]; //比较。。
int l = vl[g[i][j]] - a[i][g[i][j]];
if(e == l)
cout << i << "->" << g[i][j] << ": " << a[i][g[i][j]] << '\n';
}
}
}
int main()
{
int n, m;
cout << "请输入n个顶点和m条边关系" << '\n';
cin >> n >> m;
cout << "请输入m条边的关系" << '\n';
memset(ru, 0, sizeof(ru));
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
a[i][j] = 0;
for(int i=1; i<=m; ++i)
{
int u, v, len;
cin >> u >> v >> len;
a[u][v] = len;
g[u].push_back(v);
ru[v]++;
}
cout << "其拓扑排序的结果为:" << '\n';
if(Topo(n))
{
for(int i=1; i<=n; ++i)
cout << topo[i] << ' ';
cout << '\n';
cout << "该VOE-图的关键路径为:" << '\n';
Criticalpath(n);
}
else
cout << "不成立" << '\n';
return 0;
}
其实,如果你像要一条完整的关键路径或者求出关键路径的长度,,你可以选择在输出的时候标记一下,,这样你就可以得到其中一条关键路径和其长度了。。。在这里我没有进行标记。。。