poj 1325 Machine Schedule 最小顶点覆盖
题意
两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下.
问最小的 切换模式次数.
解题思路
A, B 两个天然二分图顶点集合, A,B机器上的两个模式之间连边即为 作业K.
最小的切换次数, 即为 最小顶点覆盖数.
特殊的定理是, 二分图中 最小顶点覆盖 = 最大匹配. (仅仅在二分图中满足. 主要是由于最大独立点集导致)
#include<stdio.h> #include<string.h> #include<stdlib.h> const int N = 110; int n, m, k; int ma[N], mb[N]; bool g[N][N], vis[N]; int path( int u ){ for(int v = 1; v < m; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( ma[v] == -1 || path( ma[v] ) ){ ma[v] = u; mb[u] = v; return 1; } } } return 0; } int main(){ while( scanf("%d", &n), n ){ scanf("%d%d", &m,&k); memset( g, 0, sizeof(g) ); int x, a, b; for(int i = 0; i < k; i++){ scanf("%d%d%d", &x,&a, &b); g[a][b] = 1; } memset( ma, 0xff, sizeof(ma) ); memset( mb, 0xff, sizeof(mb) ); int res = 0; for(int i = 1; i < n; i++){ if( mb[i] == -1 ){ memset( vis, 0, sizeof(vis)); res += path( i ); } } printf("%d\n", res ); } return 0; }