.注意:可能存在多终点情况,所以求出最大的最晚完成时间之后,应该把每个最终结点的最晚完成时间都设置成那个最大值。
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAX = 110;
const int Inf = 10000;
int N, M;
struct ENode{
int v;
int Ltime;
};
int Etime[MAX] = { 0 };
vector<ENode>Adj[MAX];
int Ind[MAX] = { 0 };
int Latime[MAX];
int Delay[MAX][MAX];
int TopS[MAX];
int TopSort(){
fill(Latime, Latime + MAX, Inf);
int cnt, ans=0;
queue<int>q;
for (int i = 1; i <= N; i++){
if (Ind[i] == 0)
q.push(i);
}
cnt = 0;
int V;
while (!q.empty()){
V = q.front();
q.pop();
TopS[++cnt] = V;
// printf("%d\n", cnt);
// printf("%d %d\n",V, cnt);
for (int i = 0; i < Adj[V].size(); i++){
int u = Adj[V][i].v;
if (Etime[V] + Adj[V][i].Ltime > Etime[u])Etime[u] = Etime[V] + Adj[V][i].Ltime;
Ind[u] -= 1;
if (Ind[u] == 0)q.push(u);
if (Etime[u]>ans)ans = Etime[u];
}
}
if (cnt != N)return-1;
else{
for (int i = N; i > 0; i--){
int u = TopS[i];
printf("%d %d\n", i, TopS[i]);
if (Adj[u].size() == 0){
Latime[u] = ans;
// printf("%d\n", Latime[u]);
}
else{
for (int j = 0; j < Adj[u].size(); j++){
int w = Adj[u][j].v;
if (Latime[w] - Adj[u][j].Ltime < Latime[u]){
Latime[u] = Latime[w] - Adj[u][j].Ltime;
// printf("%d\n", Latime[u]);
}
}
}
}
}
return ans;
}
int main(){
cin >> N >> M;
int s, e, l;
for (int i = 0; i < M; i++){
cin >> s >> e >> l;
Ind[e] += 1;
ENode V;
V.v = e;
V.Ltime = l;
Adj[s].push_back(V);
}
int ans = TopSort();
if (ans == -1)printf("0");
else {
for (int i = 1; i <= N; i++){
printf("%d %d %d\n",i , Etime[i], Latime[i]);
}
printf("%d\n", ans);
for (int i = 1; i <= N; i++){
for (int j = Adj[i].size() - 1; j >= 0; j--){
int u = Adj[i][j].v;
if (Etime[i] + Adj[i][j].Ltime == Latime[u])
printf("%d->%d\n", i, u);
}
}
}
return 0;
}