【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;
}