• hihoCoder #1127 : 二分图二·二分图最小点覆盖和最大独立集


    #1127 : 二分图二·二分图最小点覆盖和最大独立集

    Time Limit:10000ms
    Case Time Limit:1000ms
    Memory Limit:256MB

    描述

    在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了。不过相亲这个事不是说那么容易的,所以Nettle的姑姑打算收集一下之前的情况并再安排一次相亲。所以现在摆在Nettle面前的有2个问题:

    1.姑姑想要了解之前所有相亲的情况。对于任一个一次相亲,只要跟参与相亲的两人交流就可以得到这次相亲的情况。如果一个人参加了多次相亲,那么跟他交流就可以知道这几次相亲的情况。那么问题来了,挖掘技术到底哪家强姑姑最少需要跟多少人进行交流可以了解到所有相亲的情况。

    问题1解答

    2.因为春节快要结束了,姑姑打算给这些人再安排一次集体相亲。集体相亲也就是所有人在一起相亲,不再安排一对一对的进行相亲。但是姑姑有个条件,要求所有参与相亲的人之前都没有见过。也就是说在之前的每一次相亲中的两人不会被同时邀请来参加这次集体相亲。那么问题又来了,姑姑最多可以让多少人参与这个集体相亲。

    问题2解答

    输入

    第1行:2个正整数,N,M(N表示点数 2≤N≤1,000,M表示边数1≤M≤5,000)
    第2..M+1行:每行两个整数u,v,表示一条无向边(u,v)

    输出

    第1行:1个整数,表示最小点覆盖数
    第2行:1个整数,表示最大独立集数

    Sample Input
    5 4
    3 2
    1 3
    5 4
    1 5
    Sample Output
    2
    3

    解题:极大独立集与最小点覆盖互补。。。
    在二分图中有:最小点覆盖 = 最大匹配

     1 /*
     2 @author: Lev
     3 @date:
     4 */
     5 #include <iostream>
     6 #include <cstdio>
     7 #include <cmath>
     8 #include <cstring>
     9 #include <string>
    10 #include <cstdlib>
    11 #include <algorithm>
    12 #include <map>
    13 #include <set>
    14 #include <queue>
    15 #include <climits>
    16 #include <deque>
    17 #include <sstream>
    18 #include <fstream>
    19 #include <bitset>
    20 #include <iomanip>
    21 #define LL long long
    22 #define INF 0x3f3f3f3f
    23 
    24 using namespace std;
    25 const int maxn = 10010;
    26 vector<int>g[maxn];
    27 int n,m,link[maxn];
    28 bool used[maxn];
    29 bool dfs(int u){
    30     for(int i = g[u].size()-1; i >= 0; --i){
    31         if(!used[g[u][i]]){
    32             used[g[u][i]] = true;
    33             if(link[g[u][i]] == -1 || dfs(link[g[u][i]])){
    34                 link[g[u][i]] = u;
    35                 link[u] = g[u][i];
    36                 return true;
    37             }
    38         }
    39     }
    40     return false;
    41 }
    42 int main() {
    43     while(~scanf("%d %d",&n,&m)) {
    44         for(int i = 0; i < maxn; ++i) {
    45             g[i].clear();
    46             link[i] = -1;
    47             used[i] = false;
    48         }
    49         for(int i = 0; i < m; ++i) {
    50             int u,v;
    51             scanf("%d %d",&u,&v);
    52             g[u].push_back(v);
    53             g[v].push_back(u);
    54         }
    55         int ans = 0;
    56         for(int i = 1; i <= n; ++i)
    57             if(link[i] == -1){
    58                 memset(used,false,sizeof(used));
    59                 ans += dfs(i);
    60             }
    61         printf("%d
    %d
    ",ans,n-ans);
    62     }
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    .net core 学习小结之 配置介绍(config)以及热更新
    .net core 学习小结之环境配置篇
    powershell下载网站图片
    Powershell 脚本输出前十条消耗内存的进程到excel
    Linux 自学shell
    使用bat脚本进行开机启动批处理
    Git 创建分支并合并主分支
    Git 的使用及其一些基本用法
    点击按钮复制文本到剪切板
    关于一些基本排序的实现
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4321030.html
Copyright © 2020-2023  润新知