• POJ 3692 Kindergarten【最大点独立集】


    大意:

    有n个boy  m个girle   boy之间相互了解  girle之间相互了解

    又告诉你一些boy和girle之间相互了解的关系

    问最多选出多少人使其相互之间相互了解

    分析:

    左集合boy  右girle

    若boy与girle相互不了解则建一条边,这样,有边相连的便是不相互了解的

    那么最大点独立便是选取一些点使其相互之间没有边相连也就是相互了解的

    note:

    由于左右集合不相等所以选取nm中的较大的作为点的个数

    最后结果为2 * max(n, m) - 最大匹配

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int maxn = 205;
     7 
     8 int vis[maxn];
     9 int Link[maxn];
    10 int G[maxn][maxn];
    11 int n;
    12 bool Find(int i) {
    13     for(int j = 1; j <= n; j++) {
    14         if(G[i][j] == 0 && vis[j] == 0) {
    15             vis[j] = 1;
    16             if(Link[j] == -1 || Find(Link[j])) {
    17                 Link[j] = i;
    18                 return true;
    19             }
    20         }
    21     }
    22     return false;
    23 }
    24 
    25 int solve() {
    26     memset(Link, -1, sizeof(Link));
    27     int cnt = 0;
    28     for(int i = 1; i <= n; i++) {
    29         memset(vis, 0, sizeof(vis));
    30         if(Find(i)) cnt++;
    31     }
    32     return cnt;
    33 }
    34 
    35 int main() {
    36     int kase = 1;
    37     int m, k, x, y;
    38     while(scanf("%d %d %d",&n, &m, &k) && ( n + m + k ) ) {
    39         memset(G, 0, sizeof(G));
    40         while(k--) {
    41             scanf("%d %d",&x, &y);
    42             G[x][y] = 1;
    43         }
    44         int nn = n;
    45         n = max(n, m);
    46         printf("Case %d: %d
    ",kase++, n * 2 - solve() );
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    Vim
    一文搞定Samba云服务器配置(阿里云)CentOS8.3
    第四课 婴儿是如何思考的 思维的发展历程
    C++/VS基础篇
    Windows下Qt VS 打包程序 到他人电脑安装运行出现的问题
    第三课 斯金纳
    第二课基础 弗洛伊德
    C++中头文件和实现文件的关系
    字符串 数字 转换
    Ucore lab1实验报告
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/3924143.html
Copyright © 2020-2023  润新知