poj 1274 -- The Perfect Stall (二分图)

小小纪念

# include <cstdio>
# include <iostream>
# include <set>
# include <map>
# include <vector>
# include <list>
# include <queue>
# include <stack>
# include <cstring>
# include <string>
# include <cstdlib>
# include <cmath>
# include <algorithm>

# define ll long long

using namespace std ;

struct Edge {
    int v , next ;
} g [ 50000 ] ; ;
int head [ 210 ] , cnt ;
bool vis [ 210 ] ;
int n , m , cx [ 210 ] , cy [ 210 ] ;

void addedge ( int u , int v )
{
    g [ cnt ] . v = v ;
    g [ cnt ] . next = head [ u ] ;
    head [ u ] = cnt ++ ;
}

bool dfs ( int u )
{
    for ( int i = head [ u ] ; ~ i ; i = g [ i ] . next ) {
        int v = g [ i ] . v ;
        if ( ! vis [ v ] ) {
            vis [ v ] = 1 ;
            if ( cy [ v ] == -1 || dfs ( cy [ v ] ) ) {
                cx [ u ] = v ;
                cy [ v ] = u ;
                return true ;
            }
        }
    }
    return false ;
}

int fuck ( )
{
    int ans = 0 ;
    memset ( cx , -1 , sizeof ( cx ) ) ;
    memset ( cy , -1 , sizeof ( cy ) ) ;
    for ( int i = 1 ; i <= n ; i ++ ) {
        if ( cx [ i ] == -1 ) {
            memset ( vis , 0 , sizeof ( vis ) ) ;
            ans += dfs ( i ) ;
        }
    }
    return ans ;
}

int main ( )
{
    cin . sync_with_stdio ( false ) ;
    while ( cin >> n >> m ) {
        cnt = 0 ;
        memset ( head , -1 , sizeof ( head ) ) ;
        for ( int i = 1 ; i <= n ; i ++ ) {
            int num ;
            cin >> num ;
            while ( num -- ) {
                int v ;
                cin >> v ;
                addedge ( i , v ) ;
            }
        }
        cout << fuck ( ) << endl ;
    }
}


你可能感兴趣的:(poj 1274 -- The Perfect Stall (二分图))