题目链接: hdu 1150
题目大意: A机器有N种模式,B机器有M种模式
K件产品,每件产品可以由a模式或者b模式完成
问最少切换多少次模式可以完成K件产品
解题思路: N种模式作为X集合,M种模式作为Y集合
它们之间的连线表示两者取其中之一就可完成产品
问题转化为最小点覆盖集,既求最大匹配数
匈牙利算法求解二分图的最大匹配数
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 105 int n,m,edge[MAX][MAX],cx[MAX],cy[MAX],visit[MAX]; int DFS(int u) //匈牙利增广 { int i; for(i=1;i<=m;i++) { if(edge[u][i]&&!visit[i]) { visit[i]=1; if(!cy[i]||DFS(cy[i])) { cy[i]=u; cx[u]=i; return 1; } } } return 0; } int main() { int i,c,a,b,k,sum; while(scanf("%d",&n)!=EOF&&n) { scanf("%d%d",&m,&k); sum=0; memset(cx,0,sizeof(cx)); memset(cy,0,sizeof(cy)); memset(edge,0,sizeof(edge)); for(i=1;i<=k;i++) { scanf("%d%d%d",&c,&a,&b); edge[a][b]=1; //单向图 } for(i=1;i<=n;i++) { if(!cx[i]) { memset(visit,0,sizeof(visit)); sum+=DFS(i); //寻找增广轨 } } printf("%d\n",sum); } return 0; }