poj 3041 Asteroids
这是一道二分匹配题,根据Konig定理:最大匹配数=最小覆盖数;
这里我们以行为左边,以列为右边建图,这样建好后,就是一个裸的二分匹配;
View Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> using namespace std; bool G[524][524],visit[524]; int match[524]; bool path( int num ,int N ) { for( int i = 1 ; i <= N ; i++ ) { if( !visit[i] && G[num][i] ) { visit[i] = true; if( match[i]==0 || path( match[i] ,N ) ) { match[i] = num; return true; } } } return false; } int main( ) { int N,R,x,y; while( scanf( "%d %d",&N,&R ) ==2) { int ans = 0; memset( G , 0 , sizeof( G ) ); memset( match , 0 , sizeof( 0 ) ); for( int i = 1 ; i <= R ; i++ ) { scanf( "%d %d",&x,&y ); G[x][y] = true; } for( int i = 1 ; i <= N ; i ++ ) { memset( visit , 0 , sizeof( visit ) ); if( path( i ,N ) ) ans++; } printf( "%d",ans ); } //system( "pause" ); return 0; }