p8269-usaco22open-visits-s-ti-jie

news/发布时间2024/5/8 6:52:50

题意

一共有 $n$ 头奶牛,每一头奶牛都有自己想拜访的奶牛,用 $a_i$ 表示牛 $i$ 想拜访的牛。对于每一头牛 $i$,如果它想拜访的牛在家,就会离开家并拜访它,还会增加 $v_i$ 的欢乐值,最后求欢乐值的最大值。

思路

我们可以将这个问题看作一个一个图,且每一个节点的出度都是 $1$。 我们可以发现除了每个环中会有一个奶牛无法获得高兴值,其他的奶牛都可以获得高兴值。

我们可以用拓扑排序来找到所有不在环上的奶牛,将答案加上他们的高兴值。接下用 dfs 找出每个环。对于每个环中的无法获得高兴值的奶牛,我们肯定选高兴值最小的。找到每个环的奶牛的非小值并加上它们。

最后在贴上代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 1e18+10
#define int long long
const int maxn=100010;
int n,a[maxn],v[maxn],rd[maxn],ans,minn=inf;
bool vis[maxn];
queue<int>q;
void topo(){for(int i=1;i<=n;i++){if(!rd[i])q.push(i);}while(!q.empty()){int x=q.front();q.pop();ans+=v[x];rd[a[x]]--;vis[x]=1;if(!rd[a[x]])q.push(a[x]);}return;
}
void dfs(int x){vis[x]=1;minn=min(minn,v[x]);if(vis[a[x]])return;dfs(a[x]);return;
}
signed main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld%lld",&a[i],&v[i]);rd[a[i]]++;}topo();for(int i=1;i<=n;i++){if(!vis[i])ans+=v[i];}for(int i=1;i<=n;i++){if(vis[i])continue;minn=inf;dfs(i);ans-=minn;}printf("%lld",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/01270187.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

11111111111

近日,广州地铁十四号线二期完成多项施工节点:国内首个采用盾构法施工的出入口通道顺利贯通、在建所有区间开始盾构施工、马务站成功实现封顶,截至目前土建工程完成56%。 马务站基坑开挖。 国内首个采用盾构法施工的出入口通道贯通 地铁14号线二期彭边站C出入口通道是国内首个…

Godot UI线程,Task异步和消息弹窗通知

目录前言线程安全全局消息IOC注入消息窗口搭建最简单的消息提示简单使用仿Element UIElementUI 效果简单的Label样式如何快速加载多个相同节点修改一下,IOC按钮事件注册总结 前言 最近我在研究Godot的全局消息,然后发现Godot 也是有UI线程限制的,只能在主线程的子线程里面修…

java中cron表达式 每10分钟执行一次

在Java中,可以使用Quartz框架来定义和调度任务,包括使用Cron表达式来定义任务的执行时间。下面是一个使用Quartz框架实现每10分钟执行一次任务的示例: 添加Quartz依赖 在Maven项目中,添加以下依赖到pom.xml文件中: <dependency><groupId>org.quartz-scheduler…

P4568 [JLOI2011] 飞行路线

分层图的板子题 代码#include <bits/stdc++.h> #define R(x) x=read() #define fi first #define se second using namespace std;typedef pair<int,int> PII; const int N = 1e4, M = 5e5;inline int read() {int x = 0, f = 1;char ch = getchar();while(ch <…

MyBatis动态SQL

MyBatis动态SQL 动态SQL简介 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦…

Java 中文官方教程 2022 版(十四)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html设置包版本信息原文:docs.oracle.com/javase/tutorial/deployment/jar/packageman.html您可能需要在 JAR 文件的 MANIFEST.MF 中包含包版本信息。您可以使用 MANIFEST.MF 中的以下头部提供此信息: 清单中的头部头部…