二分模板
1 #define N 202 2 int useif[N]; //记录y中节点是否使用 0表示没有访问过,1为访问过 3 int link[N]; //记录当前与y节点相连的x的节点 4 int mat[N][N]; //记录连接x和y的边,如果i和j之间有边则为1,否则为0 5 int gn,gm; //二分图中x和y中点的数目 6 int can(int t) 7 { 8 int i; 9 for(i=1;i<=gm;i++) 10 { 11 if(useif[i]==0 && mat[t][i]) 12 { 13 useif[i]=1; 14 if(link[i]==-1 || can(link[i])) 15 { 16 link[i]=t; 17 return 1; 18 } 19 } 20 } 21 return 0; 22 } 23 int MaxMatch() 24 { 25 int i,num; 26 num=0; 27 memset(link,0xff,sizeof(link)); 28 for(i=1;i<=gn;i++) 29 { 30 memset(useif,0,sizeof(useif)); 31 if(can(i)) num++; 32 } 33 return num; 34 }
此上为匈牙利算法,求解最大匹配问题