今晚我们几个研究了这个题目。 二分图最大匹配模板,同时也是最小覆盖路径的模板。对应 POJ1422,水之。
#include <stdio.h>
/*
二分图最大匹配模板
最小覆盖路径模板 (最小路径=点数-最大二分匹配数)
*/
#include <string.h>//memset需要
#define Na 125//集合A数量
#define Nb 125//集合B数量
bool a2b[Na][Nb]/*关系矩阵*/,visited[Nb];/*单次查找是否已经查过*/
int link[Nb]/*集合B连接的前驱,指向A*/,A,B/*当前处理的A,B集合大小*/;
bool find(int x){//查找函数
int i;
for(i=1;i<=B;i++){
if(!visited[i]&&a2b[x][i]){
visited[i]=true;
if(link[i]==-1||find(link[i])){
link[i]=x;
return true;
}
}
}
return false;
}
int main(){
int itr,i,a,b,ans,cs;
scanf("%d",&cs);
while(cs--){
scanf("%d%d",&A,&itr);
B=A;//当前处理容量
memset(a2b,0,sizeof(a2b));//初始化关系
memset(link,-1,sizeof(link));//初始化B前驱连接
ans=0;//二分匹配数量
for(i=0;i<itr;i++){
scanf("%d%d",&a,&b);
a2b[a][b]=true;//关系建立
}
for(i=1;i<=A;i++){
memset(visited,0,sizeof(visited));//每次匹配初始化
if(find(i))ans++;//记数
}
printf("%dn",A-ans);//最小覆盖路径
}
return 0;
}