hdu 2063 过山车

简介: 点击打开链接hdu2063 思路:二分图最大匹配 分析: 1 题目要求的是给定k条边,然后求出最大的能够匹配的边数 2 很明显的二分图的最大匹配,利用DFS匈牙利算法求出最大的匹配边数 代码: #include#includ...

点击打开链接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;
}



目录
相关文章
畅通工程 HDU - 1232
畅通工程 HDU - 1232
57 0
|
算法
HDU - 2063: 过山车
HDU - 2063: 过山车
112 0
|
人工智能 测试技术
|
Java 测试技术
HDU 1232 畅通工程
畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 50540    Accepted Submission(s): 26968 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。
1002 0
|
人工智能 Java C++
HDU 3785 寻找大富翁
寻找大富翁 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6716    Accepted Submission(s): 2492 Problem Description 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
1047 0
|
人工智能 算法
|
人工智能 算法 Java