coreBugZJ

此 blog 已弃。

EOJ 2069 Asteroids

 1/*
 2EOJ 2069 Asteroids
 3
 4
 5----问题描述:
 6
 7Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500).
 8The grid contains K asteroids (1 <= K <= 10,000), which are conveniently located at the lattice points of the grid.
 9
10Fortunately, Bessie has a powerful weapon that can vaporize all the asteroids in any given row or column of the grid with a single shot.
11This weapon is quite expensive, so she wishes to use it sparingly.
12Given 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.
13
14
15----输入:
16
17* Line 1: Two integers N and K, separated by a single space.
18* 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.
19
20
21----输出:
22* Line 1: The integer representing the minimum number of times Bessie must shoot.
23
24
25----样例输入:
26
273 4
281 1
291 3
302 2
313 2
32
33
34----样例输出:
35
362
37
38
39----分析:
40
41建立二分图模型,
42若第 i 行和第 j 列处存在一个 asteroid ,则 x[i] 与 y[j] 连一条边,
43求二分图最大匹配,使用匈牙利算法。
44
45*/

46
47
48#include <stdio.h>
49#include <string.h>
50
51#define  L  503
52
53int adj[ L ][ L ], n, state[ L ], result[ L ];
54
55int find( int i ) {
56        int j, k;
57        for ( j = adj[ i ][ 0 ]; j > 0--j ) {
58                k = adj[ i ][ j ];
59                if ( state[ k ] == 0 ) {
60                        state[ k ] = 1;
61                        if ( ( result[ k ] == 0 ) || find( result[ k ] ) ) {
62                                result[ k ] = i;
63                                return 1;
64                        }

65                }

66        }

67        return 0;
68}

69
70int maxMatch() {
71        int ans = 0, i;
72        for ( i = 1; i <= n; ++i ) {
73                memset( state, 0sizeof( state ) );
74                if ( find( i ) )
75                        ++ans;
76        }

77        return ans;
78}

79
80int main() {
81        int i, j, k;
82        memset( adj, 0sizeof( adj ) );
83        memset( result, 0sizeof( result ) );
84        scanf( "%d%d"&n, &k );
85        while ( k-- ) {
86                scanf( "%d%d"&i, &j );
87                adj[ i ][ ++adj[ i ][ 0 ] ] = j;
88        }

89        printf( "%d\n", maxMatch() );
90        return 0;
91}

92

posted on 2012-03-30 22:18 coreBugZJ 阅读(395) 评论(0)  编辑 收藏 引用 所属分类: ACMAlgorithm课内作业


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理