ABC326G Unlock Achievement

题目传送门

好题

看到这个 n,m 的范围,有点网络流的意思,但还是很难想到要用最小割

如果我们考虑“总和-舍弃和”,先选择所有成就,再考虑舍弃哪些成就,这道题就可以转化为最小割模型。对于每个成就 i,如果保留就要花费 Li,j,如果舍弃就相当于花费 ai

因为 Li,j5,所以可以把每个技能 i 拆成 6 个点 idi,j,考虑如下建图

  • Sidi,6+ 的边

  • idi,j+1idi,j(j1)×ci 的边,割掉这条边表示将技能 i 升级到 j

  • 对于每个技能 i,从 idj,Li,j(j[1,n])i+ 的边

  • 对于每个技能 i,从 iTai 的边,割掉这条边表示舍弃这个成就

最后答案即为 ai 减去最小割

#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;
}
posted @   xishanmeigao  阅读(22)  评论(0编辑  收藏  举报
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示