EOJ 2069 Asteroids

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
53 int  adj[ L ][ L ], n, state[ L ], result[ L ];
54
55 int  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
70 int  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
80 int  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

你可能感兴趣的:(EOJ 2069 Asteroids)