链接:点击打开链接
题解:将模式之间换成点和点的关系,就是求每两个点连成的线段都至少要有一个端点==最大匹配
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define inf 0x3f3f3f3f
const int mx=1e2+10;
typedef long long ll;
using namespace std;
int n,m,k,cp[mx];
bool pai[mx][mx],vis[mx];
bool pipei(int x){
for(int i=1;i<=m;i++){
if(!vis[i]&&pai[x][i]){//如果i男生还没配对且存在
vis[i]=1;//表示该男生已考虑过了
if(!cp[i]||pipei(cp[i])){//判断该男生是否已经与其他人配对了,若已经配对则递归寻找该地址是否能寻找调解办法
cp[i]=x;
return 1;
}
}
}
return 0;
}
int main(){
while(cin>>n,n){
cin>>m>>k;
memset(pai,0,sizeof(pai));
memset(cp,0,sizeof(cp));
while(k--){
int x,y,t;
scanf("%d%d%d",&t,&x,&y);
pai[x][y]=1;
}
int cas=0;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(pipei(i)) cas++;
}
printf("%d\n",cas);
}
return 0;
}