匈牙利算法
目前为止还是半懂不懂的状态
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k;
int mp[200][200];//邻接矩阵
int vis[200];//B集中访问标记
int link1[200];//B集中点i匹配的A中元素
int pd(int a){
int i,j;
for(i=0;i<m;i++){
if(!vis[i] && mp[a][i]){
vis[i]=1;
if(link1[i]==-1 || pd(link1[i]))//若B集中i未匹配,或者其匹配的A中元素有其他匹配
{
link1[i]=a;
return 1;
}
}
}
return 0;
}
int main(){
while(scanf("%d",&n) &&n!=0){
scanf("%d%d",&m,&k);
int i,j;
int u,v;
memset(mp,0,sizeof(mp));
for(i=1;i<=k;i++){
scanf("%d%d%d",&j,&u,&v);//第一个数据是序号,并没有用
if(u>0&&v>0)mp[u][v]=1;//如果出点或者入点为0,机器初始状态即可解决
}
memset(link1,-1,sizeof(link1));
int ans=0;
for(i=0;i<n;i++){
memset(vis,0,sizeof(vis));
if(pd(i))ans++;
}
printf("%d\n",ans);
}
return 0;
}