zoukankan      html  css  js  c++  java
  • pku3692 Kindergarten

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

    二分图匹配,匈牙利算法(dfs+邻接矩阵),最大独立集

    最大独立集 == N - 最小点覆盖 == N - 最大匹配数

    把没有关系的两点连接,反向建图

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define N 210
     5 
     6 int n, m, map[N][N], girl[N], flag[N];
     7 
     8 int find(int x)
     9 {
    10     int i;
    11     for(i=1; i<=m; i++)
    12     {
    13         if(!flag[i] && map[x][i])
    14         {
    15             flag[i] = 1;
    16             if(girl[i]==-1 || find(girl[i]))
    17             {
    18                 girl[i] = x;
    19                 return 1;
    20             }
    21         }
    22     }
    23     return 0;
    24 }
    25 
    26 int hungary()
    27 {
    28     int i, j, sum = 0;
    29     for(i=1; i<=n; i++)
    30     {
    31         for(j=1; j<=m; j++)
    32         {
    33             flag[j] = 0;
    34         }
    35         sum += find(i);
    36     }
    37     return sum;
    38 }
    39 
    40 int main()
    41 {
    42     int i, j, k, cases;
    43     for(cases=1; scanf("%d%d%d", &n, &m, &k), n||m||k; cases++)
    44     {
    45         for(j=1; j<=m; j++)
    46         {
    47             girl[j] = -1;
    48             for(i=1; i<=n; i++)
    49             {
    50                 map[i][j] = 1;
    51             }
    52         }
    53         while(k-- && scanf("%d%d", &i, &j))
    54         {
    55             map[i][j] = 0;
    56         }
    57         printf("Case %d: %d\n", cases, n + m - hungary());
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    <把时间当做朋友>读书笔记
    C语言-第12课
    C语言-第13课
    C语言-第11课
    python-第三课-字符串详解
    C语言-第10课
    C语言-第9课
    C语言-第8课
    C语言-第7课-enum和typedef分析
    C语言-第6课
  • 原文地址:https://www.cnblogs.com/yuan1991/p/pku3692.html
Copyright © 2011-2022 走看看