涉及到二分图(二部图)、最小覆盖、最大匹配、匈牙利算法(匈牙利树)、增广路 原来这就是传说中的匈牙利 代码上很简单,但思想非常精妙 //pku1325 Machine Schedule #include <cstdio> #include <cstring> #define MAX_N 100 char map[MAX_N][MAX_N]; char mark[MAX_N]; long link[MAX_N]; long N, M; bool path(long x) { long y; for (y=1; y<M; y++) { if (0==mark[y] && map[x][y]) { mark[y] = 1; if (0==link[y] || path(link[y])) { link[y] = x; return true; } } } return false; } int main() { long n, K; while (3 == scanf("%ld%ld%ld", &N, &M, &K)) { for (n=1; n<N; n++) memset(map[n], 0, M*sizeof(map[0][0])); memset(link, 0, M*sizeof(link[0])); long i, x, y, k; for (k=0; k<K; k++) { scanf("%ld%ld%ld", &i, &x, &y); if (0!=x && 0!=y) { map[x][y] = 1; } } long total = 0; for (n=1; n<N; n++) { memset(mark, 0, M*sizeof(mark[0])); if (path(n)) total++; } printf("%ld/n", total); } return 0; }