KM算法(O(n^4)) HDU2255

来源:互联网 发布:中等收入陷阱 书籍知乎 编辑:程序博客网 时间:2024/06/14 13:28
网站:http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html
</pre><pre code_snippet_id="1577750" snippet_file_name="blog_20160213_3_5056781" name="code" class="cpp"><pre name="code" class="cpp">#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
原创粉丝点击