[USACO13FEB]Milk Scheduling【拓扑序】

这是一篇关于USACO竞赛中Milk Scheduling问题的解决方案,涉及拓扑排序。作者分享了初次尝试时的错误以及修正后的AC代码,强调在处理有先后关系的问题时,需要维护当前最大花费,并正确处理入度为0的节点。文章耗时1515分钟完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pro

Luogu3074

Sol

好水的一道拓扑题……第一次打的时候可以说是随便打的……(逃。样例过了就交了,也没检查, 结果 60 60 分, xswl x s w l 。改了改部分,加了点细节,就 AC A C 了,总共耗时 15 15 分钟……(好长)

看到题目中存在先后关系,考虑拓扑,这样题目基本上很简单了。我们比平常的拓扑多维护了一个到目前为止已经的花费,因为这个是要更新答案的,所以,一定要取一个最大值(我不知道怎么了,这里都忘了)。还有,就是预处理的时候,把入读为 0 0 的点入队的时候,他们因为入度是0,所以到目前为止的花费就是他们本身的花费。最后的答案就是各个拓扑后花费的最大值,这才是最短时间。

Code

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;

int n , m , val[10005] , ind[10005] , before[10005] , ans = 0;
vector<int>e[10005];
queue<int>q;

int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d",&val[i]);
    for(int i=1; i<=m; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        e[x].push_back(y);
        ind[y]++;
    }
    for(int i=1; i<=n; i++)
        if(!ind[i]) {
            before[i] = val[i]; 
            q.push(i);
        }
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        for(int i=0; i<e[u].size(); i++) {
            int v = e[u][i];
            before[v] = max(before[v] , before[u] + val[v]);
            ans = max(ans , before[v]);
            ind[v]--;
            if(!ind[v])
                q.push(v);
        }
    }
    printf("%d",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值