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;
}

 

posted @ 2012-07-04 14:47  wutaoKeen  阅读(138)  评论(0编辑  收藏  举报