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;
}






目录
相关文章
|
机器学习/深度学习
FZU 1683 纪念SlingShot
点击打开FZU1683 思路: 矩阵快速幂 分析: 1 题目给定f(n) = 3*f(n-1)+2*f(n-2)+7*f(n-3) , f(0) = 1 , f(1) = 3 , f(2) = 5 ,给定n求f(0)+.
903 0
FZU 2136 取糖果
点击打开链接 题意:中文题.... 思路:对于每个数,我们可以求出以当前这个点为最大值能够向左右两边扩展的范围,假设每个数的左边和右边扩展到l[i] , r[i]的位置。
732 0
FZU 2167 大王叫我来巡山呐
Problem 2167 大王叫我来巡山呐 Accept: 931    Submit: 1405Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description   大师兄在取得真经后,每天详读经书,认真完成读书笔记,理论联系实际,不断提高实践能力。
954 0
|
Windows
FZU 1889 龟兔赛跑
Problem 1889 龟兔赛跑 Accept: 1240    Submit: 1650Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description   万众瞩目的第七届龟兔赛跑比赛在北京时间3333年3月3日于火星打响。
1152 0
fzu 1901 Period II
点击打开链接fzu 1901 思路:kmp+next数组的应用 分析: 1 题目要求的找到所有满足S[i]=S[i+P] for i in [0..SIZE(S)-p-1]的前缀,并且长度为p。
1037 0
|
索引
[usaco]3.1.5 stamps
<p>Stamps</p> <p>Given a set of N stamp values (e.g., {1 cent, 3 cents}) and an upper limit K to the number of stamps that can fit on an envelope, calculate the largest unbroken list of postages
1716 0
|
算法
[USACO 2007 Jan S]Protecting the Flowers
[USACO 2007 Jan S]Protecting the Flowers
|
10月前
USACO1.3 修理牛棚
USACO1.3 修理牛棚
|
人工智能
USACO/friday
Friday the Thirteenth 黑色星期五 描述 13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的 一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.
885 0