题意:有A,B两台机器, 机器A 有 n个模式(0, 1, 2....n-1),同样机器B有m个模式, 两个机器一开始的模式都为0,有k个作业(id,x,y) 表示作业编号id, 该作业必须在A机器在模式x下或者B机器在模式y下完成,问你至少要切换几次机器模式。
思路:很裸的最小覆盖点集,不熟悉概念的多看看蓝书吧,很容易证明 最小覆盖点集 == 最大匹配
#include <cstdio> #include <cstring> #include <vector> using namespace std; vector <int> edge[113]; int pre[113]; bool vis[113]; int n, m, q; bool dfs(int u) { for(int i = 0; i < (int)edge[u].size(); i++) { int v = edge[u][i]; if(vis[v]) continue; vis[v] = 1; if(pre[v] == -1 || dfs(pre[v])) { pre[v] = u; return 1; } } return 0; } int main() { int i; while( ~scanf("%d", &n) && n) { scanf("%d%d", &m, &q); int x, y; for(i = 0; i < n; i++) edge[i].clear(); while(q--) { scanf("%*d%d%d", &x, &y); if(!x || !y) continue; edge[x].push_back(y); } memset(pre, -1, sizeof(int)*m); int cnt = 0; for(i = 0; i < n; i++) { memset(vis, 0, sizeof(bool)*m); if(dfs(i)) cnt++; } printf("%d ", cnt); } return 0; }