栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 1998 Supervisor, Supervisee

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 1998 Supervisor, Supervisee

#include<stdio.h>#include<string.h>#define eps 1e8int mat[25][25],levi[25],levj[25];int n,visi[25],visj[25],mari[25],marj[25],value,test;int dfs(int i){    visi[i]=1;    int j;    for(j=0;j<n;j++)    if(0==visj[j]&&mat[i][j]==levi[i]+levj[j])    {        visj[j]=1;        if(marj[j]==-1||dfs(marj[j]))        { marj[j]=i; mari[i]=j; return 1;        }    }    return 0;}void KM(){    int i,j,ki,min;    for(i=0;i<n;i++)    {        levi[i]=-eps;      for(j=0;j<n;j++)       levi[i]=levi[i]>mat[i][j]?levi[i]:mat[i][j];    }    memset(levj,0,sizeof(levj));    memset(mari,-1,sizeof(mari));    memset(marj,-1,sizeof(marj));    for(i=0;i<n;i++)    while(1)    {        memset(visi,0,sizeof(visi));        memset(visj,0,sizeof(visj));        if(dfs(i))break;min=eps;        for(ki=0;ki<n;ki++)        if(visi[ki])          for(j=0;j<n;j++)          if(0==visj[j]&&min>levi[ki]+levj[j]-mat[ki][j])          min=levi[ki]+levj[j]-mat[ki][j];         for(ki=0;ki<n;ki++)         {  if(visi[ki])levi[ki]-=min;  if(visj[ki])levj[ki]+=min;         }    }    value=0;    for(i=0;i<n;i++)       value-=mat[i][mari[i]];}void dfs2(int pos,int para){    if(para>value)return;    if(pos>=n)    {        if(para!=value)return;        printf("Best Pairing %dn",test++);        for(int i=0;i<n;i++)        printf("Supervisor %d with Employee %dn",i+1,mari[i]+1);    }    else    {        for(int j=0;j<n;j++)        if(visj[j]==0)        { visj[j]=1; mari[pos]=j; dfs2(pos+1,para-mat[pos][j]); visj[j]=0;        }    }}int main(){    int i,j,T,man,I=1;    scanf("%d",&T);    while(T--)    {        if(I!=1)printf("n");        scanf("%d",&n);        memset(mat,0,sizeof(mat));        for(i=0;i<n;i++)          for(j=0;j<n;j++)          {  scanf("%d",&man);  man--;  mat[man][i]-=j;          }        for(i=0;i<n;i++)          for(j=0;j<n;j++)          {   scanf("%d",&man);   man--;   mat[i][man]-=j;          }          KM();          printf("Data Set %d, Best average difference: %.6fn",I++,value*0.5/n);          memset(visj,0,sizeof(visj));test=1;          dfs2(0,0);          }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381805.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号