bzoj 1693: [Usaco2007 Demo]Asteroids(二分匹配)

来源:互联网 发布:鼎盈人工智能 编辑:程序博客网 时间:2024/06/05 05:10

1693: [Usaco2007 Demo]Asteroids

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 285  Solved: 212
[Submit][Status][Discuss]

Description

Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the grid. Fortunately, Bessie has a powerful weapon that can vaporize all the asteroids in any given row or column of the grid with a single shot. This weapon is quite expensive, so she wishes to use it sparingly. Given the location of all the asteroids in the field, find the minimum number of shots Bessie needs to fire to eliminate all of the asteroids.

Input

* Line 1: Two integers N and K, separated by a single space. * Lines 2..K+1: Each line contains two space-separated integers R and C (1 <= R, C <= N) denoting the row and column coordinates of an asteroid, respectively.

Output

* Line 1: The integer representing the minimum number of times Bessie must shoot.

Sample Input

3 4
1 1
1 3
2 2
3 2

Sample Output

2


题意:有一个n*m的网格,网格中有k个怪物,你有一把激光枪,每次可以消灭一行或一列上的所有怪物,求消灭所有怪物的最少使用次数

二分匹配,所有的行作为左半部分的点,所有的列作为右半部分的点,如果点(i, j)上有个怪物,那么左边的第i个点和右边的第j个点连一条边,之后求最大匹配就是答案

#include<stdio.h>#include<string.h>int n, road[505][505], vis[505], link[505];int Sech(int x);int main(void){int i, a, b, k, ans = 0;scanf("%d%d", &n, &k);for(i=1;i<=k;i++){scanf("%d%d", &a, &b);road[a][b] = 1;}for(i=1;i<=n;i++){memset(vis, 0, sizeof(vis));if(Sech(i)==1)ans++;}printf("%d\n", ans);return 0;}int Sech(int x){int i;for(i=1;i<=n;i++){if(vis[i]==0 && road[x][i]==1){vis[i] = 1;if(link[i]==0 || Sech(link[i])==1){link[i] = x;return 1;}}}return 0;}

原创粉丝点击