费用流
然而并不会 看了很多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;
}