【Poj 1149】PIGS

加个超赞的题解!http://ycool.com/post/zhhrrm6
简直! 我居然会把数据范围搞错!

明明定义全局变量s,t又在main()里面int了一遍 导致死循环!

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 100000000
using namespace std;

int m,n;
bool b[101][1001];
bool f[1001];
int g[110][110];
int house[1001];

int team[110],head,tail;
int d[110];
int s,t; 
bool bfs()
{
	head=tail=0;
	memset(d,0,sizeof(d));
	team[++tail]=s;
	d[s]=1;
	while(head<tail)
	{
		int x=team[++head];
		for(int i=1;i<=n;i++)
			if(d[i]==0&&g[x][i]!=0)
				d[i]=d[x]+1,team[++tail]=i;
	}
	if(d[t]==0) return false;
	else        return true;
}
int dfs(int x,int mmin)
{
	int tmp;
	if(x==t) return mmin;
	for(int i=1;i<=n;i++)
		if(d[i]==d[x]+1&&g[x][i]!=0&&(tmp=dfs(i,min(mmin,g[x][i]))))
		{
			g[x][i]-=tmp;
			g[i][x]+=tmp;
			return tmp;
		}
	return  0;
}
int main()
{
	scanf("%d %d",&m,&n);
	s=n+1,t=n+2;
	for(int i=1;i<=m;i++) scanf("%d",&house[i]);
	for(int i=1;i<=n;i++)
	{
		int tmp;scanf("%d",&tmp);
		for(int x,j=1;j<=tmp;j++)
		{
			scanf("%d",&x);
			b[i][x]=true;
			if(!f[x])
				g[s][i]+=house[x],f[x]=true;
			else 
				for(int k=1;k<i;k++) if(b[k][x]) g[k][i]=INF;
		}
		scanf("%d",&g[i][t]);
	}
	n+=2;
	int ans=0;
	while(bfs()) ans+=dfs(s,INF);
	printf("%d",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/ofsxb/p/5102430.html