zoukankan      html  css  js  c++  java
  • poj2400Supervisor, Supervisee(KM)

    http://poj.org/problem?id=2400

    KM算法http://philoscience.iteye.com/blog/1754498

    题意:每个雇主对雇员有个满意度 雇员对雇主有个满意度 求最匹配的雇员与雇主

    最小权匹配 这个给出的数据矩阵貌似是反着的 建图的时候反一下就好了

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<stdlib.h>
      7 #define N 110
      8 #define INF 0x3f3f3f
      9 using namespace std;
     10 int w[N][N],n,x[N],y[N],lx[N],ly[N],link[N],sum,o[N],vis[N],num;
     11 bool match(int u)
     12 {
     13     x[u] = 1;
     14     for(int i = 1; i <= n ; i++)
     15     if(lx[u]+ly[i]==w[u][i]&&!y[i])
     16     {
     17         y[i] = 1;
     18         if(!link[i]||match(link[i]))
     19         {
     20             link[i] = u;
     21             return true;
     22         }
     23     }
     24     return false;
     25 }
     26 double km()
     27 {
     28     int i,j,g;
     29     for(i = 1; i <= n ; i++)
     30     link[i] = lx[i] = ly[i]=0;
     31     for(i = 1 ; i <= n ; i++)
     32     {
     33         for(;;)
     34         {
     35             for(j = 1 ;j <= n ; j++)
     36             x[j] = y[j] = 0;
     37             if(match(i)) break;
     38             int d = INF;
     39             for(j = 1; j <= n ; j++)
     40             {
     41                 if(x[j])
     42                 for(g = 1; g <= n ; g++)
     43                 if(!y[g])
     44                 d = min(d,lx[j]+ly[g]-w[j][g]);
     45             }
     46             for(j = 1; j <= n ; j++)
     47             {
     48                 if(x[j]) lx[j]-=d;
     49                 if(y[j]) ly[j]+=d;
     50             }
     51         }
     52     }
     53     sum=0;
     54     for(i = 1; i <= n ; i++)
     55     sum-=(lx[i]+ly[i]);
     56     return 1.0*sum/(2*n);
     57 }
     58 void dfs(int u,int ss)
     59 {
     60     int i;
     61     if(ss>sum) return ;
     62     if(u==n+1)
     63     {
     64         printf("Best Pairing %d
    ",++num);
     65         for(i = 1 ;i <= n ; i++)
     66         printf("Supervisor %d with Employee %d
    ",i,o[i]);
     67         return ;
     68     }
     69     for(i = 1; i <= n ; i++)
     70     {
     71         if(!vis[i])
     72         {
     73             vis[i] = 1;
     74             o[u] = i;
     75             dfs(u+1,ss-w[u][i]);
     76             vis[i] = 0;
     77         }
     78     }
     79 }
     80 int main()
     81 {
     82     int i,j,kk=0,cas,a;
     83     scanf("%d",&cas);
     84     while(cas--)
     85     {
     86         kk++;num=0;
     87         scanf("%d",&n);
     88         memset(w,0,sizeof(w));
     89         memset(vis,0,sizeof(vis));
     90         for(i = 1 ; i <= n ; i++)
     91             for(j = 1; j <= n ; j++)
     92             {
     93                 scanf("%d",&a);
     94                 w[a][i] -= j;
     95             }
     96         for(i = 1 ; i <= n ; i++)
     97             for(j = 1; j <= n ; j++)
     98             {
     99                 scanf("%d",&a);
    100                 w[i][a]-=j;
    101             }
    102         double s = km();
    103         printf("Data Set %d, Best average difference: %.6f
    ",kk,s-1);
    104         dfs(1,0);
    105         puts("");
    106     }
    107     return 0;
    108 }
    View Code
  • 相关阅读:
    Hdu 1257最少拦截系统
    删除mysql__转
    sql 入门的小例子熟悉一下_这可是一个转转转贴 :)
    header 用法_转
    java_json 转换 文件在file中
    javascript_php 正则匹配 转
    mysql 忘记密码转_kinghu
    php 通用下载
    明天就是新年开始
    翻译 有助于程序命名
  • 原文地址:https://www.cnblogs.com/shangyu/p/3151240.html
Copyright © 2011-2022 走看看