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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yalishiyanzhouyu888/article/details/50674398
上一篇km算法------poj3686
下一篇manacher算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭