#include<iostream>
#include<stack>
#define INF 0xfffffff
#define N 100
using namespace std;
void CriticalPath(int Map[N][N], int n, int m);
int TopologicalOrder(int Map[N][N], stack <int> &T,int n,int m,int *ve);
int main()
{
int Map[N][N] = {0};
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int a, b, c;
cin >> a >> b >> c;
Map[a][b] = c;
}
CriticalPath(Map, n, m);
system("pause");
return 0;
}
int TopologicalOrder(int Map[N][N], stack <int> &T,int n,int m,int *ve)
{
int count = 0, Indegree[N] = {0};
stack<int> S;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++)
if (Map[i][j])
Indegree[j]++;
}
for (int i = 1; i <= n; i++)
if (Indegree[i] == 0)
S.push(i);
while (!S.empty()){
int j=S.top();
S.pop();
T.push(j);
count++;
for (int i = 1; i <= n; i++){
if (Map[j][i]){
Indegree[i]--;
if (Indegree[i] == 0){
S.push(i);
}
if (ve[j] + Map[j][i] > ve[i])
ve[i] = ve[j] + Map[j][i];
}
}
}
if (count < n)
return 0;
else
return ve[n];
}
void CriticalPath(int Map[N][N], int n, int m)
{
stack<int> T;
int ve[N] = {0};
int ven = TopologicalOrder(Map, T, n, m,ve);
if (ven==0)
cout << "Error" << endl;
else
{
int vl[N];
for (int i = 1; i <= n; i++)
vl[i] = ven;
while (!T.empty())
{
int j = T.top(); T.pop();
for (int i = 1; i <= n; i++)
{
if (Map[i][j])
{
if (vl[j] - Map[i][j] < vl[i])
vl[i] = vl[j] - Map[i][j];
}
}
}
int Way[N][N] = { 0 };
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
{
if (Map[i][j])
{
if (ve[i] == vl[j] - Map[i][j])
{
Way[i][j] = 1;
printf("%d->%d ", i, j);
}
}
}
}
}
}
/*测试数据
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
*/
关键路径
最新推荐文章于 2024-07-29 03:07:53 发布