zoukankan      html  css  js  c++  java
  • poj 2239 Selecting Courses

    确定用二分图算法,就找好对应关系,本题对应关系为一周的所有课节N=7*12,和每一科的对应。

     1 //1274,2239,2584,2536,2446
     2 //http://wenku.baidu.com/view/9962910590c69ec3d5bb75da.html    贪心最大二分匹配 
     3 //匈牙利树和增广轨 
     4 
     5 #include <cstdio>
     6 #include <cstring>
     7 
     8 int used[610]; //是否在覆盖点中
     9 
    10 int nmap[610][610];
    11 
    12 int path[610];//前一个
    13 
    14 int P,N;
    15 
    16 int cross(int k)
    17 {
    18   
    19   int i;
    20   for(i=1;i<=N;i++)
    21   {
    22     if(!nmap[k][i] || used[i])  continue;
    23 
    24     used[i] = 1;
    25     if(path[i] == -1 || cross(path[i]))
    26     {
    27       path[i] = k;
    28       return 1;
    29     }
    30   }
    31   return 0;
    32 }
    33 
    34 int hungray()
    35 {
    36   int i;
    37   int nret = 0;
    38   memset(path,-1,sizeof(path));
    39   for(i=1;i<=P;i++)
    40   {
    41     if(cross(i))  nret++;
    42     memset(used,0,sizeof(used));
    43   }
    44   return nret;
    45 }
    46 
    47 int main()
    48 {
    49   //freopen("in.txt","r",stdin);
    50   //freopen("out.txt","w",stdout);
    51   int tcase,i,j,a,b,c,z;
    52   N = 12 * 7;
    53   //scanf("%d",&tcase);
    54   while(~scanf("%d",&P))
    55   {
    56     memset(nmap,0,sizeof(nmap));
    57     for(i=1;i<=P;i++)
    58     {
    59       scanf("%d",&c);
    60       for(j=0;j<c;j++)
    61       {
    62         scanf("%d%d",&a, &b);
    63         z = (a-1)*12+b;
    64         nmap[i][z] = 1;
    65       }
    66     }
    67     printf("%d\n",hungray());
    68   }
    69   return 0;
    70 }
  • 相关阅读:

    如何找回自己!
    身体锻炼靶心心率!
    圣人言大任之人!
    如何修清净心?(净空老法师法语)
    vim 查询定位!
    深切悼念灾区遇难同胞!
    求后倒零
    植物大战僵尸【二分答案, 加贪心思想】
    植物大战僵尸【二分答案, 加贪心思想】
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2627856.html
Copyright © 2011-2022 走看看