bzoj 1280 Emmy卖猪pigs

LINK:1280: Emmy卖猪pigs

非常奇怪的最大流..建图还是一如既往的难想 感觉以前做过这个东西 所以也不难想出来辣.

考虑一头猪给谁都行都会增加贡献 但是不同位置的猪进行不同位置的挑选会带来更大的代价 这就是选位置即匹配问题.所以考虑最大流.

顾客一个一个来 就一个一个建图 为什么需要使用最大流 可能一个顾客选牛的时候选到一个点的牛 下一个顾客也可能选到 但是当前顾客有多种选择这个情况 所以需要最佳匹配来解决问题.

建图是关键 发现 对于当前的点的钥匙集合i来说 如果其之前的某个顾客的钥匙集合和其有交 那么就可以使用上一个顾客所有的牛了.

基于这个思想 我们将之前的顾客和现在的顾客直接连边就行了.

考虑正确性 发现这样做符合题目意思即符合时间的单向流动关系 且由于是最大流的缘故存在退流所以是正确的.

注意n m 别打反 就算打反了 数据范围别看反.

const int MAXN=110,maxn=1010;
int n,m,len=1,S,T,l,r;
int a[maxn],vis[maxn],q[maxn],g[maxn],cur[maxn];
int lin[maxn],ver[maxn*maxn<<1],nex[maxn*maxn<<1],e[maxn*maxn<<1];
inline void add(int x,int y,int z)
{
	ver[++len]=y;nex[len]=lin[x];lin[x]=len;e[len]=z;
	ver[++len]=x;nex[len]=lin[y];lin[y]=len;e[len]=0;
}
inline int bfs()
{
	rep(1,T,i)vis[i]=0,cur[i]=lin[i];
	l=r=0;vis[S]=1;q[++r]=S;
	while(++l<=r)
	{
		int x=q[l];
		go(x)
		{
			if(vis[tn]||!e[i])continue;
			vis[tn]=vis[x]+1;
			q[++r]=tn;
			if(tn==T)return 1;
		}
	}
	return 0;
}
inline int dinic(int x,int flow)
{
	if(x==T)return flow;
	int res=flow,k;
	for(int i=cur[x];i&&res;i=nex[i])
	{
		cur[x]=i;
		int tn=ver[i];
		if(vis[tn]==vis[x]+1&&e[i])
		{
			k=dinic(tn,min(e[i],res));
			if(!k){vis[tn]=0;continue;}
			e[i]-=k;e[i^1]+=k;res-=k;
		}
	}
	return flow-res;
}
int main()
{
	freopen("1.in","r",stdin);
	get(n);get(m);S=m+1;T=S+1;
	rep(1,n,i)get(a[i]);
	int sum=0,flow=0;
	rep(1,m,i)
	{
		int get(x);
		rep(1,x,j)
		{
			int get(y);
			if(!g[y])add(S,i,a[y]);
			else add(g[y],i,INF);
			g[y]=i;
		}
		add(i,T,read());
		while(bfs())while((flow=dinic(S,INF)))sum+=flow;
	}
	put(sum);return 0;
}

原文地址:https://www.cnblogs.com/chdy/p/12655555.html

时间: 2024-11-12 01:42:42

bzoj 1280 Emmy卖猪pigs的相关文章

【BZOJ1280】Emmy卖猪pigs 最大流

[BZOJ1280]Emmy卖猪pigs Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪圈的钥匙,他们会将这些猪圈打开并买走固定数目的猪. 所有顾客有的钥匙和他们需要买猪的数量在事先都告诉了Emmy,于是Emmy要订一个计划,使得卖出去的猪最多. 买卖的过程是这样的:一个顾客前来,并打开所有他可以打开的猪圈.然后Emmy从这些猪圈里牵出固定数目的猪卖给顾客(最多只能和顾客需要数相等),

POJ1149.PIGS(迈克卖猪问题)——最大流

http://poj.org/problem?id=1149 题目描述: 迈克在一个养猪场工作,养猪场里有M 个猪圈,每个猪圈都上了锁.由于迈克没有钥匙,所以他不能打开任何一个猪圈.要买猪的顾客一个接一个来到养猪场,每个顾客有一些猪圈的钥匙,而且他们要买一定数量的猪.某一天,所有要到养猪场买猪的顾客,他们的信息是要提前让迈克知道的.这些信息包括:顾客所拥有的钥匙(详细到有几个猪圈的钥匙.有哪几个猪圈的钥匙).要购买的数量.这样对迈克很有好处,他可以安排销售计划以便卖出的猪的数目最大.更详细的销售

POJ 1149 PIGS 迈克卖猪问题 网络流构图+三种AC方法

题目链接:POJ 1149 PIGS PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16533   Accepted: 7403 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the key

bzoj 1951 [Sdoi2010]古代猪文(数论知识)

Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了.猪

Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Status][Discuss] Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今

[BZOJ 1951][Sdoi2010]古代猪文(Lucas+CRT+费马小定理)

Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了.猪

BZOJ 1975 SDOI2010 魔法猪学院 A*k短路

题目大意:给定一个值E 求起点到终点的最多条路径 使长度之和不超过E k短路的A*算法--每一个点有一个估价函数=g[x]+h[x] 当中g[x]是从源点出发已经走了的长度 h[x]是从这个点到汇点的最短路 首先先在反图上跑一遍SPFA求出每一个点的h[x],然后将源点的g[x]+h[x]增加堆 每次取出堆顶时将堆顶的g[x]向所连接的边扩展 第k次取出汇点即是答案 当中有一个剪枝就是当第k+1次取出某个点时不继续拓展 防止MLE 可是这里k未知 我们能够对k进行估价处理 初始k=floor(E

BZOJ 1975: [Sdoi2010]魔法猪学院

1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int duin,N,M,next[200010],point[5010],v[200010],next2[200010],point2[5010],v2[200010]; 7 double c[200010],c2[200010],dist[5010]

bzoj 1951: [Sdoi2010]古代猪文

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #define ll long long 6 #define mul 999911659 7 using namespace std; 8 int n,g,a[4]; 9 int sh[4]={2,3,4679,35617},C1[4][35618]; 10 void exgcd(int a1,int