ABC326G Unlock Achievement
(题目传送门)
好题
看到这个
如果我们考虑“总和-舍弃和”,先选择所有成就,再考虑舍弃哪些成就,这道题就可以转化为最小割模型。对于每个成就
因为
-
从
连 的边 -
从
连 的边,割掉这条边表示将技能 升级到 -
对于每个技能
,从 连 的边 -
对于每个技能
,从 连 的边,割掉这条边表示舍弃这个成就
最后答案即为
#include<bits/stdc++.h>
using namespace std;
const int N=60,NN=410,M=3010,INF=1e9;
int n,m,L[N][N],a[N],c[N],ans;
int s,t,maxflow,d[NN];
int head[NN],ver[M<<1],nxt[M<<1],edge[M<<1],now[NN],tot=1;
int id1(int i,int j){return (i-1)*6+j;}
int id2(int i){return i+6*n;}
void add(int x,int y,int z)
{
ver[++tot]=y; edge[tot]=z; nxt[tot]=head[x]; head[x]=tot;
ver[++tot]=x; edge[tot]=0; nxt[tot]=head[y]; head[y]=tot;
}
bool bfs()
{
queue <int> q;
memset(d,0,sizeof(d));
d[s]=1; now[s]=head[s];
q.push(s);
while(q.size())
{
int x=q.front(); q.pop();
for(int i=head[x]; i; i=nxt[i])
{
int y=ver[i];
if(!d[y] && edge[i])
{
d[y]=d[x]+1;
now[y]=head[y];
q.push(y);
if(y==t)
return 1;
}
}
}
return 0;
}
int dinic(int x,int flow)
{
if(x==t)
return flow;
int rest=flow;
for(int &i=now[x]; i && rest; i=nxt[i])
{
int y=ver[i];
if(d[y]==d[x]+1 && edge[i])
{
int k=dinic(y,min(rest,edge[i]));
if(!k)
d[y]=0;
edge[i]-=k;
edge[i^1]+=k;
rest-=k;
if(rest<=0)
break;
}
}
return flow-rest;
}
void Dinic()
{
int flow=0;
while(bfs())
while(flow=dinic(s,INF))
maxflow+=flow;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
scanf("%d",&c[i]);
for(int i=1; i<=m; i++)
scanf("%d",&a[i]);
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
scanf("%d",&L[i][j]);
s=0; t=6*n+m+1;
for(int i=1; i<=n; i++)
{
for(int j=2; j<=6; j++)
add(id1(i,j),id1(i,j-1),(j-2)*c[i]);
add(s,id1(i,6),INF);
}
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
add(id1(j,L[i][j]),id2(i),INF);
add(id2(i),t,a[i]);
ans+=a[i];
}
Dinic();
printf("%d\n",ans-maxflow);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?