rt,主要是看到题解区全用的链式前向星,为此我C了所有题解反复对照修改才写出vector代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
int u,v,r,p,id;
bool operator<(const edge&o)const{
return r>o.r;
}
};
vector<edge>e;
vector<pair<int,int>>g[200005];
queue<int>q;
bool vis[200005];
int in[200005],ans[200005],vr[200005],vp[200005];
int main(){
cin>>n>>m;
for(int i=1,u,v,r,p;i<=m;i++){
cin>>u>>v>>r>>p;
g[v].push_back({u,i});
vp[i]=p;
vr[i]=r;
in[u]++;
e.push_back({v,u,r,p,i});
}
memset(ans,0x3f,sizeof ans);
for(int i=1;i<=n;i++){
if(!in[i])q.push(i);
}
sort(e.begin(),e.end());
for(auto x:e){
while(!q.empty()){
int v=q.front();
q.pop();
for(auto u:g[v]){
if(vis[u.second])continue;
vis[u.second]=1;
if(ans[v]<1e9){
ans[u.first]=min(ans[u.first],max(vr[u.second],ans[v]-vp[u.second]));
}
in[u.first]--;
if(!in[u.first])q.push(u.first);
}
}
if(!vis[x.id]){
vis[x.id]=1;
ans[x.v]=min(ans[x.v],x.r);
in[x.v]--;
if(!in[x.v])q.push(x.v);
}
}
for(int i=1;i<=n;i++)cout<<(ans[i]>1e9?-1:ans[i])<<" ";
}