KM算法(O(n^3)) HDU 2255

来源:互联网 发布:优爱刷黄钻软件 编辑:程序博客网 时间:2024/05/20 11:25
#include<stdio.h>#include<string.h>#include<stdlib.h>int n,a[301],b[301],w[301][301],fa[301],fb[301],hus[301],d,ans;int dfs(int u){int v;fa[u]=1;for (v=1;v<=n;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;}}}return 0;}int main(){int i,j,l;while (scanf("%d",&n)!=EOF) {for (i=1;i<=n;i++) {a[i]=0;for (j=1;j<=n;j++) {scanf("%d",&w[i][j]);if (w[i][j]>a[i]) a[i]=w[i][j];}}memset(b,0,sizeof(b));for (i=1;i<=n;i++) {while (1) {memset(fa,0,sizeof(fa));memset(fb,0,sizeof(fb));if (dfs(i)) break;d=999999999;for (j=1;j<=n;j++) {if (fa[j]) {for (l=1;l<=n;l++) {if (!fb[l]) if (d>a[j]+b[l]-w[j][l]) d=a[j]+b[l]-w[j][l];}}}if (d==999999999) break;for (j=1;j<=n;j++) {if (fa[j]) a[j]-=d;if (fb[j]) b[j]+=d;}}}for (i=1;i<=n;i++) {if (hus[i]!=0) ans+=w[hus[i]][i];}printf("%d\n",ans);}return 0;}

1 0
原创粉丝点击