Source Code Problem: 1274 User: zhouxc Memory: 4224K Time: 16MS Language: G++ Result: Accepted //link[m]表示在Left集合中与Right集合中的m的元素 //M[m][n]表示Left集合中m与Right集合中n是否相关 //visit[m]表示在一次寻找增广路径时访问过m点 Source Code #include "stdio.h" #include "string.h" int left,right,t,c,link[1000],M[1000][1000]; bool visit[1000]; int Max_Match(int s) { //printf("%d/n",s); for(int i=1;i<=right;i++) { if(!visit[i]&&M[s][i]) { visit[i]=true; //每次当该点是未浸润点,或以i点原来的匹配点为始点有扩张路径,该匹配成功 if(!link[i]||Max_Match(link[i])) { //printf("%d %d/n",s,i); link[i]=s; return true; } } // printf("/n"); } return false; } int main() { // freopen("data.in","r",stdin); while(scanf("%d%d",&left,&right)!=EOF) { int match=0; memset(M,0,sizeof(M)); memset(link,0,sizeof(link)); for(int i=1;i<=left;i++) { scanf("%d",&t); for(int j=1;j<=t;j++) { scanf("%d",&c); M[i][c]=1; } } for(int i=1;i<=left;i++) { memset(visit,false,sizeof(visit)); if(Max_Match(i)) match++; } printf("%d/n",match); } // while(1); return 0; }