P6145 [USACO20FEB] Timeline G
n 个活动 之间有偏序关系 至少在 其 后 s[] 时间后做 + 每个人物不晚于s[]时间 问最早的时间
拓扑排序+排序时递推 取最大值
/* 4 10 3 1 2 3 4 1 2 5 2 4 2 3 4 4 1 6 3 8 */ #include<cstdio> #include<iostream> #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n,m,c,rd[maxn],s[maxn]; int head[maxn],to[maxn<<1],nxt[maxn<<1],w[maxn<<1],tot; queue<int> q; void add(int u,int v,int val){ to[++tot]=v,nxt[tot]=head[u],head[u]=tot,w[tot]=val; } int main() { ios::sync_with_stdio(false); cin>>n>>m>>c; for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=c;i++){ int a,b,tim;cin>>a>>b>>tim; add(a,b,tim); rd[b]++; } for(int i=1;i<=n;i++) if(rd[i]==0) q.push(i); while(q.empty()==0) { int u=q.front();q.pop(); for(int i=head[u];i;i=nxt[i]) { int v=to[i]; rd[v]--; s[v]=max(s[v],s[u]+w[i]); if(rd[v]==0) q.push(v); } } for(int i=1;i<=n;i++) cout<<s[i]<<'\n'; return 0; }

浙公网安备 33010602011771号