ABC341F 题解
题意简述
不得不说读题是一个很重要的东西。
给你一个无向图,每个节点上有权值 ,上面还有 个棋子。
你可以执行任意次下面这样的操作:
- 选择一个上面还有棋子的点 ,拿走其中的一个棋子。
- 在与点 相连的点中选择一些点(可以不选),使得这些点的权值和严格小于 ,然后往这些点上放上一个棋子。
可以证明,在有限次操作内,棋盘中的棋子必定会全部消失,问你操作最多能执行多少次?
解法
首先注意到,这个无向图可以转化成有向图,我们对每个边判断一下,如果 能向 传递棋子就连边,即 。
进一步观察这个图,可以发现它是一个 DAG(有向无环图),证明如下:
假设这个有向图中存在一个环 ,那么根据我们的建图,可以得出 。然而 是不可能比自己大的,所以该假设不成立,进而说明这是一个有向无环图。
有向无环图是一种优美的图,因为我们可以对其进行 DP。
设 为在 点放 个棋子后,这个点可以往后的操作数,答案就是 ,现在我们的任务就转变为了求出 。
对于点 ,如何确定一种选择将要传递的点的方案是关键。发现它可以转化为 背包模型。这个点的背包体积是 ,物品就是他相邻的点,物品 的体积是 ,价值是 ,使用 背包即可求出 。
我们求 时需要已经计算出来的 ,这就是我们使用拓扑序 DP 的原因,拓扑序可以保证在求 的时候,所有的 已经被求出。
值得注意的是,就算任何物品都不选,把自己身上的一个棋子消掉也有一种操作,所以对于求出的 DP 值要加 。
剩下的就是代码细节了,可以参考我的代码。
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e3+10,M=5010;
int n,m;
struct edge{
int v,w,nxt;
}e[N*2];
int head[N],cnt=1;
void add(int u,int v,int w){
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
int w[N],a[N],d[N];
int u[N],v[N];
vector<int> f[N],g[N];
int dp[N],val[N];
void solve(int u){ // 求解点 u 的 val 值
memset(dp,0,sizeof(dp));
for(int i=0;i<f[u].size();i++){
for(int j=w[u];j>w[f[u][i]];j--){
dp[j]=max(dp[j],dp[j-w[f[u][i]]]+val[f[u][i]]);
}
}
val[u]=dp[w[u]]+1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>u[i]>>v[i];
for(int i=1;i<=n;i++)cin>>w[i];
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
if(w[v[i]]>w[u[i]])swap(u[i],v[i]);
if(w[u[i]]==w[v[i]])continue;
f[u[i]].push_back(v[i]);
g[v[i]].push_back(u[i]);
d[u[i]]++;
}
queue<int> q;
for(int i=1;i<=n;i++){
if(d[i]==0){
q.push(i);
}
}
while(!q.empty()){
int p=q.front();q.pop();
solve(p);
for(int x:g[p]){
d[x]--;
if(d[x]==0)q.push(x);
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=val[i]*a[i];
}
cout<<ans<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?