只要注意下美学值可能为负数就行了~
#include <cstdio>
#include <cstring>
int n,f,v,ans,w[101][101],lx[101],ly[101],match[101];
bool vx[101],vy[101];
inline bool find(int x){
vx[x]=1;
for (register int i=1;i<=n;i++){
if (vy[i]) continue;
int t=lx[x]+ly[i]-w[x][i];
if (t==0){
vy[i]=1;
if (match[i]==0||find(match[i])){
match[i]=x;
return 1;
}
}
}
return 0;
}
int main(void){
scanf("%d%d",&f,&v);
for (register int i=1;i<=f;i++)
for (register int j=1;j<=v;j++) scanf("%d",&w[i][j]);
if (f<v){
n=v;
for (register int i=f+1;i<=n;i++)
for (register int j=1;j<=n;j++) w[i][j]=-2147483647;
}else n=f;
for (register int i=1;i<=n;i++){
lx[i]=-2147483647;
for (register int j=1;j<=n;j++) if (lx[i]<w[i][j]) lx[i]=w[i][j];
}
for (register int i=1;i<=n;i++){
//printf("%d\n",i);
while (1){
memset(vx,0,sizeof(vx));
memset(vy,0,sizeof(vy));
if (find(i)) break;
int d=2147483647;
for (register int j=1;j<=n;j++){
if (!vx[j]) continue;
for (register int k=1;k<=n;k++){
if (vy[k]) continue;
if (lx[j]+ly[k]-w[j][k]<d) d=lx[j]+ly[k]-w[j][k];
}
}
for (register int j=1;j<=n;j++){
if (vx[j]) lx[j]-=d;
if (vy[j]) ly[j]+=d;
}
}
}
//for (register int i=1;i<=n;i++) printf("%d:%d\n",i,match[i]);
for (register int i=1;i<=n;i++)
if (w[match[i]][i]!=-2147483647) ans+=w[match[i]][i];
printf("%d",ans);
//while (1);
return 0;
}