http://acm.hdu.edu.cn/showproblem.php?pid=2063
来个邻接表的,当然邻接矩阵更简单
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=510, M=1100; 6 int u[M],v[M],next[M],first[N],n; 7 int mat[N]; 8 bool vis[N]; 9 bool find(int ue) 10 { 11 for(int e=first[ue];e!=-1;e=next[e]) if(!vis[v[e]]) 12 { 13 int ve=v[e]; 14 vis[ve]=1; 15 if(mat[ve]==-1 || find(mat[ve])) 16 { 17 mat[ve]=ue; 18 return 1; 19 } 20 } 21 return 0; 22 } 23 int maxmatch() 24 { 25 int cnt=0; 26 memset(mat,-1,sizeof(mat)); 27 for(int i=1;i<=n;i++) 28 { 29 memset(vis,0,sizeof(vis)); 30 if(find(i)) cnt++; 31 } 32 return cnt; 33 } 34 int main() 35 { 36 int m,k; 37 while(scanf("%d%d%d",&m,&n,&k),m) 38 { 39 memset(first,-1,sizeof(first)); 40 for(int e=0;e<m;e++) 41 { 42 scanf("%d%d",&u[e],&v[e]); 43 next[e]=first[u[e]]; 44 first[u[e]]=e; 45 } 46 int ans=maxmatch(); 47 printf("%d\n",ans); 48 } 49 return 0; 50 }