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;
 } 

 

posted @ 2023-09-27 15:48  JMXZ  阅读(24)  评论(0)    收藏  举报