POJ3686 KM最大权匹配+高难度建图
2016-02-15 16:23
375 查看
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<algorithm> #define For(i,j,k) for (i=j;i<=k;i++) using namespace std; const int dmax=2750,INF=100000000; int a[dmax][dmax],slack[dmax],d[dmax]; int lx[dmax],ly[dmax],nx,ny; bool px[dmax],py[dmax]; bool dfs(int x){ int i,j; px[x]=1; For(i,1,ny){ if (py[i]) continue; int t=lx[x]+ly[i]-a[x][i]; if (t==0){ py[i]=1; if (!d[i] || dfs(d[i])){ d[i]=x; return 1; } } if (t<slack[i]) slack[i]=t; } return 0; } int main(){ int i,j,k,m,n,T; scanf("%d",&T); while (T--){ memset(d,0,sizeof(d)); scanf("%d%d",&n,&m); int tmp=0,read; nx=n,ny=n*m; For(i,1,n){ tmp=0; For(j,1,m){ scanf("%d",&read); For(k,1,n) a[i][++tmp]=-read*k; } } int max; For(i,1,nx){ max=-INF; For(j,1,ny) if (a[i][j]>max) max=a[i][j]; lx[i]=max; } memset(ly,0,sizeof(ly)); For(i,1,nx){ For(j,1,ny) slack[j]=INF; while (1){ memset(px,0,sizeof(px)); memset(py,0,sizeof(py)); if (dfs(i)) break; max=INF; For(j,1,ny) if (!py[j] && slack[j]<max) max=slack[j]; For(j,1,nx) if (px[j]) lx[j]-=max; For(j,1,ny) if (py[j]) ly[j]+=max; else slack[j]-=max; } } int ans=0; For(i,1,ny) ans-=a[d[i]][i]; double sum=ans*1.0/n; printf("%.6f\n",sum); } return 0; }
相关文章推荐
- js基础篇——call/apply、arguments、undefined/null
- 2016.2.15 16年第一天上班 ZooKeeper集群的安装、配置
- Android应用程序权限机制的源代码分析(1)
- 重写前奏~继承和多态
- iOS 利用CoreLocation和MapKit开发搜索附近的商场功能
- js基础篇——call/apply、arguments、undefined/null
- mongodb java driver3.0初探
- Java 高并发缓存与Guava Cache
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- _exit 和 exit的区别
- 开机需要重新设置默认网关
- DB2操作流程
- 获取日期Date年月日
- 深入浅出Python装饰器
- Android的四大组件——Activity
- jquery.validate 自定义验证方法
- HTML5物理游戏开发 - 越野山地自行车(二)创建一辆可操控的自行车
- iOS之UIRefreshControl系统下拉刷新
- background-image背景图片拉伸平铺
- VsFtpd服务配置简明笔记