hdu 2063
http://acm.hdu.edu.cn/showproblem.php?pid=2063
第一个二分图。裸二分图。

#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<stdlib.h> using namespace std; const int maxn = 501; int as[maxn][maxn]; int vis[maxn],to[maxn]; int k,n,m; int dfs(int x) { int i; for(i = 1; i <= m; ++ i) { if(!as[x][i]||vis[i])continue; vis[i] = 1; if(to[i]==-1||dfs(to[i])) { to[i] = x; return 1; } }return 0; } int main() { int i,j,s,t,ans; while(scanf("%d",&k)==1) { if(!k)break; scanf("%d %d",&n,&m); memset(to,-1,sizeof(to)); memset(as,0,sizeof(as)); for(i = 0; i < k; ++ i){ scanf("%d %d",&s,&t); as[s][t] = 1; } ans = 0; for(i = 1; i <= n; ++ i){ memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n",ans); }return 0; }