POJ 3041 Asteroids(二分图 && 匈牙利算法 && 最小点覆盖)

嗯...

题目链接:http://poj.org/problem?id=3041

这道题的思想比较奇特:

把x坐标、y坐标分别看成是二分图两边的点,如果(x,y)上有行星,则将(x,y)之间连一条边,而我们要做的就是要找尽量少的点把所有的边覆盖,即为最小点覆盖问题,根据König定理:最小覆盖点数=最大匹配数,所以就可以用匈牙利算法求最大匹配了。

AC代码:

 #include<cstdio>
#include<cstring>
#include<iostream> using namespace std; int match[], vis[], g[][], n; inline int dfs(int u){
for(int i = ; i <= n; i++){
if(g[u][i] && !vis[i]){
vis[i] = ;
if(!match[i] || dfs(match[i])){
match[i] = u;
return ;
}
}
}
return ;
}//匈牙利 inline int hungary(){
int ans = ;
for(int i = ; i <= n; i++){
memset(vis, , sizeof(vis));
if(dfs(i)) ans++;
}
return ans;
} int main(){
int k;
while(~scanf("%d%d", &n, &k)){
for(int i = ; i <= k; i++){
int r, c;
scanf("%d%d", &r, &c);
g[r][c] = ;
}
printf("%d\n", hungary());
}
return ;
}

AC代码

上一篇:减少重复代码的书写--Lombok


下一篇:Asteroids POJ - 3041 匈牙利算法+最小点覆盖König定理