poj3686(KM)

来源:互联网 发布:六皇后问题答案java 编辑:程序博客网 时间:2024/05/17 05:55
#include<stdio.h>#include<string.h>int m,n,u,uu,ww[60][60],w[3600][3600],a[60],b[3600],hus[3600],fa[60],fb[3600],s[3600],d;int dfs(int u){int v;fa[u]=1;for (v=1;v<=m;v++) {if (!fb[v] && a[u]+b[v]==w[u][v]) {fb[v]=1;if (hus[v]==0 || dfs(hus[v])) {hus[v]=u;return 1;}} else if (!fb[v])if (s[v]>a[u]+b[v]-w[u][v]) s[v]=a[u]+b[v]-w[u][v];}return 0;}int main(){int i,j,l;scanf("%d",&uu);for (u=1;u<=uu;u++) {memset(w,0,sizeof(w));scanf("%d%d",&n,&m);for (i=1;i<=n;i++) {for (j=1;j<=m;j++) scanf("%d",&ww[i][j]);}for (i=1;i<=n;i++) for (j=1;j<=m;j++) for (l=0;l<=n;l++) w[i][j+l*m]=w[i][j+l*m]-ww[i][j]*(l+1);for (i=1;i<=n;i++) {a[i]=-999999999;for (j=1;j<=m+n*m;j++) if (a[i]<w[i][j]) a[i]=w[i][j];}m=m+n*m;memset(hus,0,sizeof(hus));memset(b,0,sizeof(b));for (i=1;i<=n;i++) {for (j=1;j<=m;j++) s[j]=999999999;while (1) {memset(fa,0,sizeof(fa));memset(fb,0,sizeof(fb));if (dfs(i)) break;d=999999999;for (j=1;j<=m;j++) if (fb[j]==0) if (d>s[j]) d=s[j];if (d==999999999) break;for (j=1;j<=n;j++) if (fa[j]) a[j]-=d;for (j=1;j<=m;j++) if (fb[j]) b[j]+=d; else s[j]=s[j]-d;}}int ans=0;for (i=1;i<=m;i++) if (hus[i]!=0) ans+=w[hus[i]][i];printf("%lf\n",-double(ans)/n);}return 0;}

1 0
原创粉丝点击