码迷,mamicode.com
首页 > 其他好文 > 详细

打鸟 二分图最大匹配

时间:2017-08-17 23:32:22      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:amp   匹配   top   ons   rip   class   二分图   ica   space   

有一款名叫打鸟的游戏,游戏中有 mm 只鸟在一个 n \times nn×n 的网格中。你可以每次选择消灭一横排的鸟,也可以选择消灭一竖排的鸟(小鸟那么萌,为什么要消灭他)。你的任务是消灭地图上所有的小鸟,那么你最少需要多少次操作,才能消灭所有的小鸟。

输入格式

第一行输入两个整数 n (1\leq n \leq 10000)n(1n10000),m (1\leq m \leq 20000)m(1m20000),分别表示网格的大小和小鸟的数量。

接下来的 mm 行,每行输入两个整数 x, yx,y,代表这只鸟在地图中的坐标。(1 \leq x,y \leq n1x,yn)

输出格式

输出消灭所有小鸟需要的最少操作数。

样例输入

3 4
1 2
2 1
3 3
2 3

样例输出

3

分析:
问题可以转换有多少个点互相不同行或不同列。
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10010;
vector<int>map[maxn];
bool book[maxn];
int match[maxn];
bool dfs(int s){
    book[s]=1;
    for(int i=0;i<map[s].size();++i){
        int v=map[s][i];
        if(!match[v]||!book[match[v]]&&dfs(match[v])){
            match[v]=s;
            return 1;
        }
    }
    return 0;
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int x,y;
        cin>>x>>y;
        map[x].push_back(y);
    }
    int ans=0;
    for(int i=1;i<=n;++i){
        memset(book,0,sizeof(book));
        if(dfs(i))++ans;
    }
    cout<<ans;
    return 0;
}

 

打鸟 二分图最大匹配

标签:amp   匹配   top   ons   rip   class   二分图   ica   space   

原文地址:http://www.cnblogs.com/Dream-Runner/p/7384873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!