poj2400===km

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值