求最小点覆盖数,即最大匹配数,匈牙利算法。
1 #include<stdio.h> 2 #include<string.h> 3 int map[505][505],vis[505],linker[505];//linker[]记录V2中的点i在V1中所匹配的点x的编号 4 int n,k; 5 int dfs(int x) 6 { 7 for (int i = 1; i <= n; i++) 8 { 9 if (map[x][i] && !vis[i])//x到i有边且i点未被标记 10 { 11 vis[i] = 1; 12 if (!linker[i]||dfs(linker[i]))//i没有匹配或被i匹配到的点可以找到增广路 13 { 14 linker[i] = x;//更新匹配 15 return 1;//匹配成功 16 } 17 } 18 } 19 return 0;//匹配失败 20 } 21 int main() 22 { 23 scanf("%d%d",&n,&k); 24 memset(map,0,sizeof(map)); 25 memset(linker,0,sizeof(linker)); 26 for (int i = 1; i <= k; i++) 27 { 28 int u,v; 29 scanf("%d%d",&u,&v); 30 map[u][v] = 1; 31 } 32 int cnt = 0; 33 for (int i = 1; i <= n; i ++) 34 { 35 memset(vis,0,sizeof(vis));//清除标记 36 if (dfs(i)) 37 cnt++; 38 } 39 printf("%d ",cnt); 40 return 0; 41 }