解题报告
题意:
给出NxN的矩阵,有M个点是障碍
每次只能删除一行或者一列,最少删除多少次才能清除障碍
思路:
把行和列看作两个集合结点,把障碍看作集合结点的连线,这样就转化成求用最少的点来消灭边,也就是最小点覆盖。
在二分图中:(n个结点,且没有孤立的点)
最小点覆盖=最大匹配
最大点独立=结点数-最大匹配
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 510
using namespace std;
int mmap[N+N][N+N],n,k,vis[N+N],pre[N+N];
int dfs(int x)
{
int i;
for(i=n+1; i<=n+n; i++) {
if(!vis[i]&&mmap[x][i]) {
vis[i]=1;
if(pre[i]==-1||dfs(pre[i])) {
pre[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,x,y;
while(cin>>n>>k) {
memset(mmap,0,sizeof(mmap));
memset(pre,-1,sizeof(pre));
for(i=0; i<k; i++) {
cin>>x>>y;
mmap[x][n+y]=1;
}
int ans=0;
for(i=1; i<=n; i++) {
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
cout<<ans<<endl;
}
}
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 14694 | Accepted: 8016 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
Source
POJ训练计划3041_Asteroids(二分图/最小点覆盖=最大匹配),布布扣,bubuko.com
POJ训练计划3041_Asteroids(二分图/最小点覆盖=最大匹配)
原文:http://blog.csdn.net/juncoder/article/details/38135053