【CodeVS 1028】 花店橱窗布置

费用流

然而并不会 看了很多ppt blog 都讲得很模糊! 并不懂
比着 代码 码了一遍....

一个<打成<=,RE了半天!!!

#include <cstdio>
#include <cstring>
#define Inf 100000
using namespace std;
int f,v;
int s,t;
int n;
int g[2030][2030]; int fa[2030];
int c[2030][2030];
int team[203000],head,tail; 
bool b[2030];
int d[2030];

bool spfa()
{
	head=tail=0;
	memset(b,false,sizeof(b));
	for(int i=1;i<=n;i++) d[i]=-Inf;
	team[++tail]=s; b[s]=true; d[s]=0;
	while(head<tail)
	{
		int x=team[++head]; b[x]=false;
		for(int i=1;i<=n;i++)
			if(c[x][i]&&d[i]<g[x][i]+d[x])
			{
				d[i]=d[x]+g[x][i];
				fa[i]=x;
				if(!b[i]) team[++tail]=i,b[i]=true;
			}
	}	
	if(d[t]==-Inf) return false;
	return true;
}

int main()
{
	scanf("%d%d",&f,&v);
	for(int i=1;i<=f;i++)
		for(int j=1;j<=v;j++)
		{
			scanf("%d",&g[i][j+f]);
			g[j+f][i]=-g[i][j+f];
			c[i][j+f]=1;
		}	
	n=f+v;s=n+1;t=n+2;
	for(int i=1;i<=f;i++) c[s][i]=1;
	for(int i=1;i<=v;i++) c[i+f][t]=1;

	n+=2;
	int ans=0;
	while(spfa())
	{		
		
		int tmp=t;
		while(tmp!=s)
		{
			ans+=g[fa[tmp]][tmp];
			c[fa[tmp]][tmp]-=1;
			c[tmp][fa[tmp]]+=1;
			tmp=fa[tmp];
		}
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2016-01-06 10:00  sxb_201  阅读(156)  评论(0编辑  收藏  举报