【codevs1033】 蚯蚓的游戏问题

http://codevs.cn/problem/1033/ (题目链接)

题意

  给出一个梯形的数列,每一个数可以向它左下方和右下方的数走。求从第一行走到最后一行的不重叠的K条路径,使得经过的数的和最大。

Solution

  很显然的费用流。每个点拆成两个,之间连一条容量为1,费用为数字大小的边。

细节

  最近写题总是bug百出。。网络流的数组大小真是玄学问题。。

代码

// codevs1033
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=10000;
struct edge {int from,to,next,w,c;}e[maxn*100];
int head[maxn],vis[maxn],p[maxn],f[maxn],dis[maxn];
int n,m,es,et,K,cnt=1,a[1000][1000];

void link(int u,int v,int w,int c) {
	e[++cnt]=(edge){u,v,head[u],w,c};head[u]=cnt;
	e[++cnt]=(edge){v,u,head[v],0,-c};head[v]=cnt;
}
int SPFA() {
	queue<int> q;q.push(es);
	memset(dis,-1,sizeof(dis));
	dis[es]=0;f[es]=inf;
	while (!q.empty()) {
		int x=q.front();q.pop();
		vis[x]=0;
		for (int i=head[x];i;i=e[i].next) if (e[i].w && dis[e[i].to]<dis[x]+e[i].c) {
				dis[e[i].to]=dis[x]+e[i].c;
				f[e[i].to]=min(e[i].w,f[x]);
				p[e[i].to]=i;
				if (!vis[e[i].to]) q.push(e[i].to),vis[e[i].to]=1;
			}
	}
	if (dis[et]<0) return 0;
	for (int i=p[et];i;i=p[e[i].from]) e[i].w-=f[et],e[i^1].w+=f[et];
	return f[et]*dis[et];
}
int EK() {
	int ans=0;
	for (int i=1;i<=K;i++)
		ans+=SPFA();
	return ans;
}
int main() {
	scanf("%d%d%d",&n,&m,&K);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m+i-1;j++) a[i][j]=++es;
	es++;et=es+1;
	for (int i=1;i<=n;i++)
		for (int x,j=1;j<=m+i-1;j++) {
			scanf("%d",&x);
			int u=a[i][j],v=a[i][j]+et;
			link(u,v,1,x);link(u,v,inf,0);
			if (i==1) link(es,u,inf,0);
			if (i==n) link(v,et,inf,0);
			if (i>1 && j>1) link(a[i-1][j-1]+et,u,1,0);
			if (i>1 && j<m+i-1) link(a[i-1][j]+et,u,1,0);
		}
	printf("%d",EK());
	return 0;
}

  

时间: 2024-08-09 08:18:45

【codevs1033】 蚯蚓的游戏问题的相关文章

codevs1033 蚯蚓的游戏问题

Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1)  a(1,2)…a(1,m) a(2,1)  a(2,2)  a(2,3)…a(2,m)  a(2,m+1) a(3,1)  a (3,2)  a(3,3)…a(3,m+1)  a(3,m+2) …… a(n,1)   a(n,2)   a(n,3)…           a(n,m+n-1) 它们把食物分成n行,第1行有m堆的食物,每堆的食物量分别是a(1,1),a(1,2

Codevs1033蚯蚓的游戏问题-费用流

将田地上的食物取负,求图的最小费用流即为最大费用流的相反数.(ps第一次听说还可以这样用思路:用spfa求最短路,沿着最短路增广. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<vector> 6 #include<queue> 7 #define maxn 0x3f3f3f3f 8 using

1033 蚯蚓的游戏问题

题目描述 Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1)  a(1,2)-a(1,m) a(2,1)  a(2,2)  a(2,3)-a(2,m)  a(2,m+1) a(3,1)  a (3,2)  a(3,3)-a(3,m+1)  a(3,m+2) -- a(n,1)   a(n,2)   a(n,3)-           a(n,m+n-1) 它们把食物分成n行,第1行有m堆的食物,每堆的食物量分别是a(1,1),

【CODEVS】1033 蚯蚓的游戏问题

[算法]网络流-最小费用最大流(费用流) [题解]与方格取数2类似 在S后添加辅助点S_,限流k 每条边不能重复走,限流1 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int inf=0x3f3f3f3f,maxn=40,maxN=5000; struct edge{int from,v,flow,cost;}e[150000]; int n,m,k,

7、8月刷题总结

准备开学了囧,7.8月刷题记录,以后好来复习,并且还要好好总结! 数据结构: splay: [BZOJ]1503: [NOI2004]郁闷的出纳员(Splay) [BZOJ]1269: [AHOI2006]文本编辑器editor(Splay) [BZOJ]1507: [NOI2003]Editor(Splay) treap: [BZOJ]1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心) [BZOJ]3224: Tyvj

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

Python:游戏:贪吃蛇(附源码)

贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么画? 蛇是由一个个小方块组成的,那么我们可以用一个 list 记录每一个小方块的坐标,显示的时候将所有小方块画出来即可. 2.蛇怎么移动? 第一反应就是想蚯蚓蠕动一样,每一个方块向前移动一格,但这样做很麻烦,仔细想下,其实除了头尾,蛇的其他部分根本就没有动过,那就简单了,将下一格的坐标添加到 list 开头,并移除 list 的最后一个元素,就相当于蛇向前移动了一格. 3.如何判定游戏结束? 蛇移动超出了游戏区的范围或者碰到了

20170913自制猜数字游戏

/* 猜数字:系统随机生成一个四位数,请根据下列判断猜出来 A:数值正确,位置正确 B:数值正确,位置不正确 C:数值不正确 */ #include<stdio.h> #include<time.h> #include<stdlib.h> #pragma warning (disable:4996) #define pUCharHead unsigned char * //以数组形式返回n个无重复的随机数,范围可指定[min,max] pUCharHead GenNoR

洛谷P1199 三国游戏

题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之间有一个"默契值",表示若此两位武将作为一对组合作战时,该组合的威力有多大.游戏开始前,所有武将都是自由的(称为自由武将,一旦某个自由武将被选中作为某方军队的一员,那么他就不再是自由武将了),换句话说,所谓的自由武将不属于任何一方. 游戏开始,小涵和计算机要从自由武将中挑选武将组成自己的军