输入样例
参考2013年408考研真题
输出样例
测试代码
#include <bits/stdc++.h>
using namespace std;
bool toporder(const vector<vector<pair<int, int> > > &adj, vector<int> &ord, vector<int> &v_e){
vector<int> ind(adj.size(), 0);
for(auto &poi: adj){
for(auto &edg: poi){
ind[edg.second]++;
}
}
queue<int> que;
for(int poi=0; poi<(int)adj.size(); poi++){
if(ind[poi] == 0){
que.push(poi);
}
}
v_e.resize(adj.size(), 0);
while(!que.empty()){
int poi = que.front();
que.pop();
ord.push_back(poi);
for(auto &edg: adj[poi]){
if(--ind[edg.second] == 0){
que.push(edg.second);
}
v_e[edg.second] = max(v_e[edg.second], v_e[poi]+edg.first);
}
}
if(ord.size() != adj.size()){
return false;
}
return true;
}
inline int critical_path_length(const vector<int> &ord, const vector<int> &v_e){
return v_e[ord.back()];
}
void event_last_time(const vector<vector<pair<int, int> > > &adj, const vector<int> &ord, const vector<int> &v_e, vector<int> &v_l){
v_l.resize(adj.size(), v_e[ord.back()]);
for(auto ptr=ord.rbegin(); ptr!=ord.rend(); ptr++){
for(auto &edg: adj[*ptr]){
v_l[*ptr] = min(v_l[*ptr], v_l[edg.second]-edg.first);
}
}
}
void critical_activity(const vector<vector<pair<int, int> > > &adj, const vector<int> &v_e, const vector<int> &v_l, vector<pair<int, int> > &c_a){
for(int poi=0; poi<(int)adj.size(); poi++){
for(auto edg: adj[poi]){
int e_e = v_e[poi];
int e_l = v_l[edg.second]-edg.first;
if(e_e == e_l){
c_a.push_back({poi, edg.second});
}
}
}
}
int main(){
int n, k;
cin >> n >> k;
vector<vector<pair<int, int> > > adj(n);
for(int i=0; i<k; i++){
int l, r, v;
cin >> l >> r >> v;
adj[l].push_back({v, r});
}
vector<int> ord;
vector<int> v_e;
if(toporder(adj, ord, v_e)){
copy(ord.begin(), ord.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}else{
cout << "ERROR" << endl;
return 0;
}
vector<int> v_l;
event_last_time(adj, ord, v_e, v_l);
vector<pair<int, int> > c_a;
critical_activity(adj, v_e, v_l, c_a);
cout << critical_path_length(ord, v_e) << endl;
for(auto &i: c_a){
cout << i.first << "->" << i.second << endl;
}
return 0;
}