水题,直接套用KM模板就可以过掉了。
我的代码:
#include<stdio.h> #include<algorithm> #include<string.h> #define inf 99999999 using namespace std; int map[305][305]; int lx[305],ly[305]; bool x[305],y[305]; int link[305]; int n; bool dfs(int u) { int i; x[u]=true; for(i=1;i<=n;i++) { if(lx[u]+ly[i]==map[u][i]&&!y[i]) { y[i]=true; if(link[i]==-1||dfs(link[i])) { link[i]=u; return true; } } } return false; } int main() { int i,j,k; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); memset(x,0,sizeof(y)); memset(y,0,sizeof(y)); memset(link,-1,sizeof(link)); for(i=1;i<=n;i++) lx[i]=inf; memset(ly,0,sizeof(ly)); for(k=1;k<=n;k++) { while(1) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); if(dfs(k)) break; int d=inf; for(i=1;i<=n;i++) if(x[i]) for(j=1;j<=n;j++) if(!y[j]&&lx[i]+ly[j]-map[i][j]<d) d=lx[i]+ly[j]-map[i][j]; for(i=1;i<=n;i++) if(x[i]) lx[i]=lx[i]-d; for(i=1;i<=n;i++) if(y[i]) ly[i]=ly[i]+d; } } int ans=0; for(i=1;i<=n;i++) ans=ans+map[link[i]][i]; printf("%d\n",ans); } return 0; }