• [POJ] 2239 Selecting Courses(二分图最大匹配)


    题目地址:http://poj.org/problem?id=2239

    Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节。问Li Ming最多可以选多少节课。把n种课划分为X集合,把一周的84节课划分为Y集合,

    从Xi向Yi连边,那么就转化成了求二分图的最大匹配数,然后匈牙利算法就可以了。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<string.h>
     4 #include<algorithm>
     5 #include<math.h>
     6 #include<stdbool.h>
     7 #include<time.h>
     8 #include<stdlib.h>
     9 #include<set>
    10 #include<map>
    11 #include<stack>
    12 #include<queue>
    13 #include<vector>
    14 using namespace std;
    15 #define clr(x,y)    memset(x,y,sizeof(x))
    16 #define sqr(x)      ((x)*(x))
    17 #define rep(i,a,b)  for(int i=(a);i<=(b);i++)
    18 #define LL          long long
    19 #define INF         0x3f3f3f3f
    20 #define A           first
    21 #define B           second
    22 #define PI          acos(-1.0)
    23 const int N=500+131;
    24 int n,f[N],g[N][N],link[N];
    25 
    26 void init()
    27 {
    28     clr(f,0);
    29     clr(g,0);
    30     clr(link,-1);
    31 }
    32 
    33 bool find(int x)
    34 {
    35     for(int i=1;i<=84;i++) {
    36         if(!f[i] && g[x][i]) {
    37             f[i]=1;
    38             if(link[i]==-1 || find(link[i])) {
    39                 link[i]=x;
    40                 return true;
    41             }
    42         }
    43     }
    44     
    45     return false;
    46 }
    47 
    48 int hungary()
    49 {
    50     int ans=0;
    51     for(int i=1;i<=n;i++) {
    52         clr(f,0);
    53         if(find(i)) ans++;
    54     }
    55     return ans;
    56 }
    57 
    58 int main()
    59 {
    60     int u,v,k;
    61     
    62     while(~scanf("%d",&n)) {
    63         init();
    64         for(int i=1;i<=n;i++) {
    65             scanf("%d",&k);
    66             for(int j=1;j<=k;j++) {
    67                 scanf("%d%d",&u,&v);
    68                 g[i][(u-1)*12+v]=1;
    69             }
    70         }
    71         printf("%d
    ",hungary());
    72     }
    73     
    74     
    75     return 0;
    76 }
  • 相关阅读:
    codevs 3115 高精度练习之减法 swap
    codevs 3116 高精度练习之加法
    poj 3984 迷宫问题
    codevs m进制转化成10进制
    codevs 1214 线段覆盖
    codevs 3143 二叉树的序遍历
    codevs 3145 汉诺塔
    HDU 5093 Battle ships [二分图匹配]
    HDU 5074 Hatsune Miku [dp] ——2014鞍山现场赛E题
    ZOJ 3793 First Digit (逗比题)
  • 原文地址:https://www.cnblogs.com/sxiszero/p/4379242.html
Copyright © 2020-2023  润新知