FZU 2039 pets

简介: 点击打开链接FZU2039 思路:二分图水题 分析:只要建模然后套模板ok 代码: /*DFS求二分图的最大匹配*/#include#include#include#includeusing namespace std;...

点击打开链接FZU2039


思路:二分图水题
分析:只要建模然后套模板ok

代码:

/*DFS求二分图的最大匹配*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 110
int T;
int Nx , Ny , e;/*Nx Ny分别表示的是左右两边的最大的集合的个数*/
int G[MAXN][MAXN];
int Mx[MAXN] , My[MAXN];/*Mx , My分别表示的是左右两边是否和另一边相连的点的编号*/
bool mark[MAXN];/*标记右边的点是否被匹配过*/

/*查找增广路*/
bool FindPath(int u){
    /*枚举所有的右边集合的点*/
    for(int i = 1 ; i <= Ny ; i++){
       if(G[u][i] && !mark[i]){
         mark[i] = true;
         if(My[i] == -1 || FindPath(My[i])){
           /*互换*/
           My[i] = u;
           Mx[u] = i;
           return true;
         }   
       }
    }
    return false;
}

/*求最大的匹配*/
int MaxMatch(){
   int cnt = 0;
   memset(Mx , -1 , sizeof(Mx));/*左边集合初始话为空*/
   memset(My , -1 , sizeof(My));/*右边集合初始化为空*/
   /*每一次都找左边一个未匹配的点进行找增广路*/
   for(int i = 1 ; i <= Nx ; i++){
      if(Mx[i] == -1){
        memset(mark , 0 , sizeof(mark));/*每次的进行初始化mark数组*/
        if(FindPath(i))/*找到了增广路则cnt++*/
          cnt++;
      }
   }
   return cnt;
}

int main(){
   int a , b;
   scanf("%d" , &T);
   for(int i = 1 ; i <= T ; i++){
      scanf("%d%d%d" , &Nx , &Ny , &e);
      
      /*建模*/
      for(int j = 1 ; j <= Nx ; j++){
         for(int k = 1 ; k <= Ny ; k++)
            G[j][k] = 1;
      }
      for(int j = 0 ; j < e ; j++){
         scanf("%d%d" , &a , &b);
         G[a][b] = 0;
      }

      printf("Case %d: %d\n" , i , MaxMatch());
   }
   return 0;
}



/*BFS找二分图最大匹配*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 1010

int T;
int Nx , Ny;/*左边集合和右边集合*/
int G[MAXN][MAXN];/*存储关系的矩阵*/
int Mx[MAXN] , My[MAXN];/*左边和右边点和另外边相连的编号*/
int pre[MAXN] , Q[MAXN];
int mark[MAXN];

int MaxMatch(){
    int ans = 0;
    int front , rear;
    /*把左边和右边集合置为空*/
    memset(Mx , -1 , sizeof(Mx));
    memset(My , -1 , sizeof(My));
    memset(mark , -1 , sizeof(mark));
    
    for(int i = 1 ; i <= Nx ; i++){
       if(Mx[i] == -1){
          front = rear = 0;
          Q[rear++] = i;
          pre[i] = -1;

          bool flag = 0;

          while(front < rear && !flag){
              int u = Q[front];
              for(int v = 1 ; v <= Ny && !flag ; v++){
                 if(G[u][v] && mark[v] != i){
                   mark[v] = i;
                   Q[rear++] = My[v];
                   if(My[v] >= 0)
                     pre[My[v]] = u;
                   else{
                     flag = 1;
                     int d = u , e = v;
                     while(d != -1){
                         int t = Mx[d];
                         Mx[d] = e;
                         My[e] = d;
                         d = pre[d];
                         e = t;
                     }
                   }
                 }         
              }
              front++;
          }
          if(Mx[i] != -1)
            ans++;
       }
    }
    return ans;
}

int main(){
   int a , b , e;
   scanf("%d" , &T);
   for(int i = 1 ; i <= T ; i++){
      scanf("%d%d%d" , &Nx , &Ny , &e);
      /*建模*/
      for(int j = 1 ; j <= Nx ; j++){
         for(int k = 1 ; k <= Ny ; k++)
            G[j][k] = 1;
      }
      for(int j = 0 ; j < e ; j++){
         scanf("%d%d" , &a , &b);
         G[a][b] = 0;
      }
      printf("Case %d: %d\n" , i , MaxMatch());
   }
   return 0;
}






目录
相关文章
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
176 0
|
Java 应用服务中间件
tomcat配置访问项目时不需要加项目名称
java web部署后,访问项目的时候,需要在地址中添加项目名称,那么如何去掉项目名称直接访问项目呢? 目前有两种方式: 方式1:修改conf目录下的server.xml配置 [html] view plain copy                       说明: docBase:代表项目的绝对路径。
2650 0
|
人工智能 JSON JavaScript
AI Earth 开发者模式—— 如何加载影像?以Landsat 5 影像为例
AI Earth 开发者模式—— 如何加载影像?以Landsat 5 影像为例
711 1
AI Earth 开发者模式—— 如何加载影像?以Landsat 5 影像为例
|
Oracle 关系型数据库 数据库
国产化瀚高数据库数据迁移文档:oracle11g数据库转瀚高8.6数据库实例演示
国产化瀚高数据库数据迁移文档:oracle11g数据库转瀚高8.6数据库实例演示
857 0
国产化瀚高数据库数据迁移文档:oracle11g数据库转瀚高8.6数据库实例演示
|
存储 边缘计算 人工智能
深度揭秘华为边缘计算系统设计的六大核心原则
伴随着业务场景的不断变化和丰富,边缘计算的内涵不断被重新定义和延展。随着云原生进入 2.0 阶段,云原生技术在边缘计算系统设计中也发挥了重要的作用。
810 0
深度揭秘华为边缘计算系统设计的六大核心原则
|
测试技术
软件测试面试题:QA 和测试的区别?
软件测试面试题:QA 和测试的区别?
442 0
|
传感器 机器学习/深度学习 边缘计算
高精地图技术专栏 | 基于空间连续性的异常3D点云修复技术
我们需要通过激光的内部机制和数据处理算法,将这些噪声恢复到它本来的位置。本文会从MTA问题产生的原理、激光应对MTA的内部机制、数据处理算法三方面来介绍高精资料处理是如何解决这个问题的。
|
算法 安全 网络安全
阿里云CDN不止于加速:基于https国密算法构建安全数据传输链路
5月20日,阿里云政企安全加速解决方案正式发布。在发布会中,阿里云技术专家林胜恩从HTTPS的技术概述,国密算法的标准内容以及国密算法在阿里云CDN上的应用情况三个方面,来介绍了阿里云CDN在安全方面的重要实践。
2085 0
阿里云CDN不止于加速:基于https国密算法构建安全数据传输链路
|
API 计算机视觉 Python
Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
Py之PIL:Python的PIL库的简介、安装、使用方法详细攻略
|
监控 网络协议 开发工具
难得的好文:如何构建一套高可用的 APP 消息推送平台
消息推送作为移动 APP 运营中的一项关键技术,已经被越来越广泛的运用。本文追溯了推送技术的发展历史,剖析了其核心原理,并对推送服务的关键技术进行深入剖析,围绕消息推送时产生的服务不稳定性,消息丢失、延迟,接入复杂性,统计缺失等问题,提供了一整套平台级的高可用消息推送解决方案。
2905 0