您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: