【Poj 3436】 ACM Computer Factory

.....这题还有什么要说的吗
我真是弱!!!

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

struct GG
{
	int v;
	int fo[11];
	int to[11];
}a[110];
int m,n;
int s,t;
int g[110][110];
int ou[110][110];

int d[110];
int team[110],head,tail;
bool can(int x,int y)
{
	for(int i=1;i<=m;i++)
		if(a[x].to[i]!=a[y].fo[i]&&a[y].fo[i]!=2)
			return false;
	return true;
}
bool bfs()
{
	head=tail=0;
	memset(d,0,sizeof(d));
	d[s]=1;
	team[++tail]=s;
	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*2+1;
	t=n*2+2;
	for(int i=1;i<=n;i++)
	{
		bool bb=true;
		scanf("%d",&g[i][i+n]);
		for(int j=1;j<=m;j++) 
			scanf("%d",&a[i].fo[j]);
		for(int j=1;j<=m;j++) 
			scanf("%d",&a[i].to[j]);
	}
	for(int i=1;i<=m;i++) a[s].to[i]=0,a[t].fo[i]=1;
	for(int i=1;i<=n;i++) if(can(s,i)) g[s][i]=INF;
	for(int i=1;i<=n;i++) if(can(i,t)) g[i+n][t]=INF;
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j&&can(i,j)) g[i+n][j]=INF;	
	n*=2;
	n+=2;

	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			ou[i][j]=g[i][j];
	int ans=0;
	while(bfs()) ans+=dfs(s,INF);
	
	n-=2;
	printf("%d ",ans);
	int tmp=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(ou[i][j]==INF&&g[i][j]!=ou[i][j]) 
				tmp++;
	printf("%d\n",tmp);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(ou[i][j]==INF&&g[i][j]!=ou[i][j])		
				printf("%d %d %d\n",i-n/2,j,ou[i][j]-g[i][j]);
	return 0;
}
原文地址:https://www.cnblogs.com/ofsxb/p/5100167.html