#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
const int maxn=21,inf=10000010;
int n,lx[maxn],ly[maxn],w[maxn][maxn],d[maxn],t,ans,num,h[maxn];
bool px[maxn],py[maxn];
bool dfs1(int x){
int i;
px[x]=true;
for(i=1;i<=n;i++){
if(py[i]) continue;
t=lx[x]+ly[i]-w[x][i];
if(t==0){
py[i]=true;
if(d[i]==0 || dfs1(d[i])){
d[i]=x;
return true;
}
}
}
return false;
}
void dfs2(int x,int sum){
int i;
if(sum>ans) return;
if(x>n){
if(sum!=ans) return;
printf("Best Pairing %d\n",++num);
for(i=1;i<=n;i++)
printf("Supervisor %d with Employee %d\n",i,h[i]);
return;
}
for(i=1;i<=n;i++)
if(!py[i]){
h[x]=i;
py[i]=true;
dfs2(x+1,sum-w[x][i]);
py[i]=false;
}
return;
}
int main(){
int i,j,k,t1,u;
scanf("%d",&t1);
for(u=1;u<=t1;u++){
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&k);
w[k][i]=1-j;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&k);
w[i][k]+=1-j;
}
memset(ly,0,sizeof(ly));
for(i=1;i<=n;i++){
lx[i]=w[i][1];
for(j=2;j<=n;j++)
if(lx[i]<w[i][j])
lx[i]=w[i][j];
}
memset(d,0,sizeof(d));
for(i=1;i<=n;i++)
while(1){
memset(px,false,sizeof(px));
memset(py,false,sizeof(py));
if(dfs1(i)) break;
t=inf;
for(j=1;j<=n;j++)
if(px[j])
for(k=1;k<=n;k++)
if(!py[k] && lx[j]+ly[k]-w[j][k]<t)
t=lx[j]+ly[k]-w[j][k];
for(j=1;j<=n;j++){
if(px[j]) lx[j]-=t;
if(py[j]) ly[j]+=t;
}
}
ans=0;
for(i=1;i<=n;i++)
if(d[i]!=0)
ans-=w[d[i]][i];
printf("Data Set %d, Best average difference: %.6f\n",u,ans*0.5/n);
num=0;
memset(h,0,sizeof(h));
memset(py,false,sizeof(py));
dfs2(1,0);
if(u<t1)
puts("");
}
return 0;
}
poj2400===km
最新推荐文章于 2019-10-03 18:48:57 发布