题意:某人想实现太空旅行,可以通过空洞实现,而它们的连通方式就是一张n * n的矩阵;现在有一种武器,可以一次性消灭它的一行或者一列(意思就是相当于留下一条可行路)。
解析:利用匈牙利算法实现,二分图匹配
#include<iostream>
#include<cstring>
#include<cstdio>>
using namespace std;
const int maxn = 1005;
int mapp[ maxn ][ maxn ], vis[ maxn ], cx[ maxn ], cy[ maxn ];
int n, m, nx, ny;
int Path( int u ){
ny = n;
for( int v = 1; v <= ny; ++v ){
if( mapp[ u ][ v ] && !vis[ v ] ){
vis[ v ] = 1;
if( cy[ v ] == -1 || Path( cy[ v ] ) ){
cx[ u ] = v;
cy[ v ] = u;
return 1;
}
}
}
return 0;
}
int main(){
while( scanf( "%d%d", &n, &m ) != EOF ){
int x, y;
memset( mapp, 0, sizeof( mapp ) );
memset( cx, -1, sizeof( cx ) );
memset( cy, -1, sizeof( cy ) );
for( int i = 0; i < m; ++i ){
scanf( "%d%d", &x, &y );
mapp[ x ][ y ] = 1;
}
nx = n;
int ans = 0;
for( int i = 1; i <= nx; ++i ){
memset( vis, 0, sizeof( vis ) );
if( cx[ i ] == -1 ){
ans += Path( i );
}
}
printf( "%d\n", ans );
}
return 0;
}