題目鏈接: 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;
}