题目描述
给定有向图无环的边信息,求每个顶点的最早开始时间、最迟开始时间。
输入
第一行图的顶点总数
第二行边的总数
第三行开始,每条边的时间长度,格式为源结点 目的结点 长度
输出
第一行:第个顶点的最早开始时间
第二行:每个顶点的最迟开始时间
样例输入
9
12
0 1 3
0 2 10
1 3 9
1 4 13
2 4 12
2 5 7
3 6 8
3 7 4
4 7 6
5 7 11
6 8 2
7 8 5
样例输出
0 3 10 12 22 17 20 28 33
0 9 10 23 22 17 31 28 33
代码
#include "bits/stdc++.h"
using namespace std;
const int maxn=1e5+20;
int n,m,in[maxn],cnt,top[maxn];
vector<int> node[maxn],val[maxn];
int ea[maxn],la[maxn];
void topsort(){
queue<int> q;
for(int i=0;i<n;i++){
if(in[i]==0) q.push(i);
}
while(!q.empty()){
int now=q.front();
q.pop();
top[++cnt]=now;
for(int i=0;i<node[now].size();i++){
int j=node[now][i];
if(--in[j]==0) q.push(j);
}
}
}
int main(){
// freopen("123.in","r",stdin);
cin>>n>>m;
while(m--){
int a,b,c;
cin>>a>>b>>c;
node[a].push_back(b);
in[b]++;
val[a].push_back(c);
}
topsort();
for(int v=1;v<=cnt;v++){
int u=top[v];
for(int i=0;i<node[u].size();i++){
int j=node[u][i],w=val[u][i];
ea[j]=max(ea[j],ea[u]+w);
}
}
for(int i=0;i<n;i++){
cout<<ea[i]<<" ";
la[i]=ea[top[cnt]];
}
cout<<endl;
for(int v=cnt;v>=1;v--){
int u=top[v];
for(int i=0;i<node[u].size();i++){
int j=node[u][i],w=val[u][i];
la[u]=min(la[u],la[j]-w);
}
}
for(int i=0;i<n;i++){
cout<<la[i]<<" ";
}
return 0;
}