#include <iostream>
#include <stack>
#include <cstring>
#define N 1001
using namespace std;
int ve[N];
int vl[N];
int topo[N];
int in[N];
int map[N][N];
stack <int> s;
int n,m,cnt;
/*
6 8
0 1 2
0 2 15
1 3 10
1 4 19
2 1 4
2 4 11
3 5 6
4 5 5
拓扑序列为:
0 2 1 3 4 5
事件的最早发生时间和最迟发生时间:
0 0
19 19
15 15
29 37
38 38
43 43
关键活动路径为:
<0,2>
<1,4>
<2,1>
<4,5>
*/
bool Topper(){
int cnt = 0 ;
for (int i = 0; i < n; i++) if(in[i] == 0) s.push(i);
while(!s.empty()){
int u = s.top();
s.pop();
topo[cnt++] = u;
for (int i = 0; i < n; i++){ // 需要遍历n次
if(map[u][i]!=0){
in[i]--;
if(in[i] == 0) s.push(i);
}
}
}
if(cnt < n) return 0;
return 1;
}
bool CriticalPath(){
if(Topper()){
cout << "拓扑排序为: "<< endl;
for(int i = 0; i < n; i++){
cout << topo[i] << "\t";
}
cout << endl;
}else{
cout << "你输入的图有环,请重新输入" <<endl;
}
cout << "到此一游1" << endl;
//===最早事件==
for (int i = 0; i < n; i++)
{
int u = topo[i];
for (int j = 0; j< n; j++){
if(map[u][j]!=0){
if(ve[j] < ve[u]+map[u][j]){
ve[j] = ve[u]+map[u][j];
}
}
}
}
//===最早事件结束==
for (int i = 0; i < n; i++)vl[i]= ve[n-1];
//?===最迟事件===
// for (int j = n-1; j >=0; j--)
// {
// int u = topo[j];
// for (int i = 0 ; i < n; i++){
// if(map[i][u]!=0){
// // cout << "u:" << i << " v: " << u << " " << map[i][u]<< endl;
// // cout << "vlu:" << vl[i] << "vlv:"<<vl[u] <<" w :" << map[i][u] << endl;
// cout << " vl"<<i<<"u: " << vl[i] << " vl"<<u<<"v: "<<vl[u] <<" w : " << map[i][u] << " " << vl[u] - map[u][i]<< endl;
// if(vl[i] > vl[u] - map[u][i]){
// vl[i] = vl[u] - map[u][i];
// cout << "STAR_ vlu: " << vl[i] << " vlv: "<<vl[u] <<" w : " << map[i][u] << endl;
// }
// }
// }
// }
for(int i = n-1; i>=0;i--){
int u = topo[i];
for (int j = 0; j < n; j++)
{
if(map[j][u]!=0){
cout << j << " " << u << endl;
if(vl[j] > vl[u] - map[j][u]){
vl[j] = vl[u] - map[j][u];
}
}
}
}
//?===最迟事件结束==
cout << "<最早事件,最晚事件>" << endl;
for (int i = 0; i < n; i++)
{
cout << "<" << ve[i] << "," << vl[i] << ">" << endl;
}
cout << "最早事件 最晚事件已结束" << endl;
for (int i = 0; i < n ; i++)
{
for(int j = 0;j < n;j++){
if(map[i][j]!=0){
// cout << i << j << endl;
int e = ve[i];
int w = map[i][j];
int l = vl[j] - w;
if(e==l){
cout << "<<" << i << "," << j << ">>" << endl;
}
}
}
}
return 1;
}
int main(){
memset(in,0,sizeof(in));
memset(ve,0,sizeof(ve));
memset(topo,0,sizeof(ve));
for(int i = 0; i < N;i++)
for(int j = 0; j < N;j++)
map[i][j] = 0;
//============初始化=================
cin >> n >> m;
int u,v,w;
for (int i = 0; i < m; i++)
{
cin >> u >> v >> w;
map[u][v] = w;
in[v]++;
}
CriticalPath();
cout << " 关键路径执行完毕喽!" << endl;
}
[算法模板] 关键路径
最新推荐文章于 2024-05-28 12:11:29 发布