ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(最大流,二分图的多重匹配) Magic Potion

2021-07-06 10:54:16  阅读:193  来源: 互联网

标签:二分 Potion Magic idx int ne 怪物 药水 勇士


在这里插入图片描述
题意:n个人,m个怪物,k瓶药水,每个人可以打死对应的集合里面的一个怪物,一碰药水可以让一个人多打死一个怪物,每个人最多只能用一瓶药水,问最多能打死多少个怪物
思路:想到了匹配,然后用最大流做,一开始想的建图是从超级原点连一条容量是n+k的边到虚拟节点,然后虚拟节点与所有勇士连一条容量是2的边,然后勇士与对应的怪物连1的边,怪物与汇点连1的边跑最大流,然后wa了,错误在于我们这样做默认勇士可以用药了,然后k等于0的时候,答案就不对了,所以正解是超级源点和所有勇士连1的边,药水节点与勇士连1的边,超级源点与药水连k的边,勇士和对应怪物连1的边,怪物与汇点连1的边,跑最大流
ac代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N=10000,M=60010;
int h[N],ne[M],e[M],idx,f[M];
void add(int a,int b,int c)
{
	e[idx]=b,ne[idx]=h[a],f[idx]=c,h[a]=idx++;
	e[idx]=a,ne[idx]=h[b],f[idx]=0,h[b]=idx++;
}
const int INF=1e8;
int S0,S,T,n,m,k;
int d[N];
int cur[N];
int q[N];
int bfs()
{
	int hh=0,tt=0;
	memset(d,-1,sizeof d);
	//cout<<S<<endl;
	d[S]=0;
	cur[S]=h[S];
	q[0]=S;
	while(hh<=tt)
	{
		int t=q[hh++];
		for(int i=h[t];~i;i=ne[i])
		{
			int j=e[i];
			if(f[i]&&d[j]==-1)
			{
				d[j]=d[t]+1;
				cur[j]=h[j];
				if(j==T)	return true;
				q[++tt]=j;
			}
		}
	}
	return false;
}	
int dfs(int u,int limit)
{
	//cout<<u<<endl;
	if(u==T)
		return limit;
	int flow=0;
	for(int i=cur[u];~i&&flow<limit;i=ne[i])
	{
		int j=e[i];
		cur[u]=i;
		if(d[j]==d[u]+1 && f[i])
		{
			int t=dfs(j,min(f[i],limit-flow));
			if(!t)
			d[j]=-1;
			f[i]-=t;
			flow+=t;
			f[i^1]+=t;
		}
	}
	return flow;
}
int dinic()
{
	int res=0,flow;
	while(bfs())
	while(flow=dfs(S,INF))
	res+=flow;
	return res;
}
int main()
{
	cin >> n >> m >> k;
	//cout<<n<<' '<<m<<' '<<k<<endl;
	memset(h,-1,sizeof h);
	for(int i=1;i<=n;i++)
	{
		int t;
		cin>>t;
		while(t--)
		{
			int x;
			cin>>x;
			add(i,n+x,1);
		}
	}
	for(int i=1;i<=n;i++)
		add(n+m+1,i,1),add(0,i,1);
	for(int i=n+1;i<=n+m;i++)
		add(i,n+m+2,1);
		add(0,n+m+1,k);
		S=0;
		T=n+m+2;
		cout<<dinic()<<endl;
}

 

标签:二分,Potion,Magic,idx,int,ne,怪物,药水,勇士
来源: https://blog.51cto.com/u_15287527/2986946

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有