匈牙利算法, 敲难
在网上看到了一片比较好的文章http://blog.csdn.net/dark_scope/article/details/8880547
题目的大意就是尽可能多的为每一个男生去匹配女生 。
#include<cstdio> #include<cstring> #define N 500 + 10 using namespace std; bool find(int x); bool matrix[N][N] , link[N]; int boys[N]; int k , boy , girl , a , b , ans = 0; int main() { while(scanf("%d" , &k) && k) { scanf("%d%d" , &girl , &boy); memset(boys , 0 , sizeof(boys)); for(int i=0; i<N; i++) memset(matrix[i] , 0 , sizeof(matrix[i])); for(int i=0; i<k; i++) { scanf("%d%d" , &a , &b); matrix[a][b] = 1; } for(int i=1; i<=girl; i++) { memset(link , 0 , sizeof(link)); if(find(i)) ans++; } printf("%d\n" , ans); ans = 0; } return 0; } bool find(int x) { for(int i=1; i<=boy; i++) if(matrix[x][i] && !link[i]) { link[i] = 1; if(!boys[i] || find(boys[i])) { boys[i] = x; return true; } } return false; }