有一款名叫打鸟的游戏,游戏中有 mm 只鸟在一个 n \times nn×n 的网格中。你可以每次选择消灭一横排的鸟,也可以选择消灭一竖排的鸟(小鸟那么萌,为什么要消灭他)。你的任务是消灭地图上所有的小鸟,那么你最少需要多少次操作,才能消灭所有的小鸟。
输入格式
第一行输入两个整数 n (1\leq n \leq 10000)n(1≤n≤10000),m (1\leq m \leq 20000)m(1≤m≤20000),分别表示网格的大小和小鸟的数量。
接下来的 mm 行,每行输入两个整数 x, yx,y,代表这只鸟在地图中的坐标。(1 \leq x,y \leq n1≤x,y≤n)
输出格式
输出消灭所有小鸟需要的最少操作数。
样例输入
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; }
时间: 2024-10-12 09:06:58