#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N=105;
int n,m;
vector<int>v[N];
vector<int>rv[N];
int early_t[N],las_t[N];
int cost[N];
void add_edge(int a,int b){
v[a].push_back(b);//正向建图
rv[b].push_back(a);//反向建图
}
void dfs(int i){
if(v[i].empty()) return;
for(auto t:v[i]){//更新最早时间
if(early_t[t]>early_t[i]+cost[i]){
early_t[t]=cost[i]+early_t[i];
}
dfs(t);
}
}
void rdfs(int i){
if(rv[i].empty()) return;
for(auto t:rv[i]){
if(las_t[t]<las_t[i]+cost[i]){
las_t[t]=cost[i]+las_t[i];
}
rdfs(t);
}
}
void update_dfs(){//正向遍历
for(int i=1;i<=m;i++){
dfs(i);
}
}
void rev_dfs(){//求最晚可以看成从最后一天开始反着求
for(int i=m;i>=1;i--){
rdfs(i);
}
}
int main(){
cin>>n>>m;
memset(early_t,0x3f,sizeof early_t);
for(int i=1;i<=m;i++){
int rely;
cin>>rely;
if(rely==0){
early_t[i]=1;
}
add_edge(rely,i);
las_t[i]=1;
}
for(int i=1;i<=m;i++){
cin>>cost[i];
}
update_dfs();
for(int i=1;i<=m;i++){
cout << early_t[i] <<" ";
}
cout<<'\n';
rev_dfs();
bool flag=false;
for(int i=1;i<=m;i++){
if(las_t[i] + cost[i] -1 > n) flag=true;//超出天数n
}
if(flag)
return 0;
for(int i=1;i<=m;i++){
cout<< n-las_t[i]-cost[i]+2 <<" ";
}
}
202212-2训练计划
最新推荐文章于 2024-05-20 20:08:58 发布