且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

hdu 2063 过山车

更新时间:2022-08-12 16:21:48

点击打开链接hdu2063


思路:二分图最大匹配
分析:
1 题目要求的是给定k条边,然后求出最大的能够匹配的边数
2 很明显的二分图的最大匹配,利用DFS匈牙利算法求出最大的匹配边数

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

#define MAXN 510

int Nx , Ny , k;
int G[MAXN][MAXN];
int Mx[MAXN] , My[MAXN];
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 ans = 0;
   memset(Mx , -1 , sizeof(Mx));
   memset(My , -1 , sizeof(My));
   /*左边集找未匹配的点*/
   for(int i = 1 ; i <= Nx ; i++){
      if(Mx[i] == -1){/*未匹配的点是-1*/
        memset(mark , 0 , sizeof(mark));
        if(FindPath(i))
          ans++;
      }
   }
   return ans;
}

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