hdu-1083
题目链锁 :http://acm.hdu.edu.cn/showproblem.php?pid=1083
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<stdio.h> #include<algorithm> #include<cmath> #include<set> #include<map> #include<queue> #include<vector> using namespace std; #define inf 0x3f3f3f3f #define eps 1e-9 #define mod 1000000007 #define FOR(i,s,t) for(int i = s; i < t; ++i ) #define REP(i,s,t) for( int i = s; i <= t; ++i ) #define LL long long #define ULL unsigned long long #define pii pair<int,int> #define MP make_pair #define lson id << 1 , l , m #define rson id << 1 | 1 , m + 1 , r #define maxn ( 300+10 ) #define maxe ( 50000+10 ) vector < int > G[maxn]; int nu, nv; int link[maxn]; bool vis[maxn]; bool dfs ( int u ) { for( int i = 0; i < G[u].size(); ++ i ) { int v = G[u][i]; if( vis[v] ) continue; vis[v] = 1; if( link[v] == -1 || dfs( link[v] ) ){ link[v] = u; return true; } } return false; } int hungary () { memset( link, -1, sizeof( link ) ); int res = 0; for( int i = 1; i <= nu; i ++ ) { memset( vis,0, sizeof( vis ) ); if( dfs( i ) ) ++res; } return res; } int main () { int T; scanf("%d", &T ); while( T-- ) { scanf("%d%d", &nv, &nu ) ; for( int i = 1; i <= nu; ++i ) G[i].clear(); for( int i = 1; i <= nv; ++i ) { int num; scanf("%d", &num ); int u; while( num-- ) scanf("%d", &u ), G[u].push_back( i ); } if( hungary( ) == nv ) puts("YES" ); else puts("NO" ); } }
hdu-2444
题目链锁:http://acm.hdu.edu.cn/showproblem.php?pid=2444
#include<iostream> #include<cstring> #include<string> #include<cstdio> #include<stdio.h> #include<algorithm> #include<cmath> #include<set> #include<map> #include<queue> #include<vector> using namespace std; #define inf 0x3f3f3f3f #define eps 1e-9 #define mod 1000000007 #define FOR(i,s,t) for(int i = s; i < t; ++i ) #define REP(i,s,t) for( int i = s; i <= t; ++i ) #define LL long long #define ULL unsigned long long #define pii pair<int,int> #define MP make_pair #define lson id << 1 , l , m #define rson id << 1 | 1 , m + 1 , r #define maxn ( 200+10 ) #define maxe ( 50000+10 ) vector < int > G[maxn]; int col[maxn]; bool judge ( int u ) { for( int i = 0; i < G[u].size(); ++i ) { int v = G[u][i]; if( col[v] == col[u] ) return 0; if( !col[v] ) { col[v] = 3 - col[u]; if( !judge( v ) ) return 0; } } return 1; } bool vis[maxn]; int link[maxn]; bool dfs ( int u ) { for( int i = 0; i < G[u].size(); ++i ) { int v = G[u][i]; if( !vis[v] ) { vis[v] = 1; if( link[v] == -1 || dfs( link[v] ) ) { link[v] = u; return 1; } } } return 0; } int hungry ( int n ) { int ans = 0; memset( link, -1, sizeof( link ) ); for( int i = 1; i <= n; ++i ) { memset( vis, 0, sizeof( vis ) ); if( dfs ( i ) ) ++ans; } return ans ; } bool can ( int n ) { memset( col, 0, sizeof( col ) ); for( int i = 1; i <= n; ++i ) { if( col[i] ) continue; col[i] = 1; if( !judge( i ) ) return false; } return true; } int main () { int n, m, u, v; while( ~scanf("%d%d", &n, &m ) ) { for( int i = 1; i <= n; ++i ) G[i].clear(); for( int i = 0; i < m; ++i ) { scanf("%d%d", &u, &v ) ; G[u].push_back( v ); G[v].push_back( u ); } if( can( n ) ) printf("%d\n", hungry( n )/2 ); else puts("No"); } }