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;

}

 

你可能感兴趣的:(poj)