poj2400===km

来源:互联网 发布:js滑动幻灯片轮播代码 编辑:程序博客网 时间:2024/06/03 16:20
#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
原创粉丝点击