地址
点击打开链接
这个题目能用匈牙利的原因是,没有环。
这个题目,我就一个纳闷的地方,因为做过的上上道题,是男女孩问题,那个时候我们把最大匹配数除以了2
而这个题目,思路一样,但是最终并没有进行/2操作。
当时对男孩女孩的理解是,没有办法区分出谁是男孩,谁是女孩,所以就克隆出来了一倍的人,最终就进行了除以2的操作
而这个题目,是路口和路口之间的连接问题,这个地方有点想不明白,求告知。Orz
代码:
#include<iostream>
#include<string.h>
#include<cstdio>
#define MAX 155
using namespace std;
int n ,m , k;
int Map[MAX][MAX];//两个人是否有关系
bool used[MAX];//是否被访问过
int linker[MAX];//查看被连接的那一个集合是否有男生来连接了。
bool dfs(int a){
for(int j = 1 ; j <= n ; j ++)
{
if(!used[j]&&Map[a][j])
{
used[j]=1 ;
if(linker[j]==-1||dfs(linker[j]))
{
linker[j]=a;
return true ;
}
}
}
return false ;
}
int hungary(){
int ans = 0 ;
memset(linker,-1,sizeof(linker));
for(int i = 1 ; i <=n ; i ++)
{
memset(used,0,sizeof(used));
if(dfs(i)) ans+=1;
}
return ans ;
}
int main(){
int i , j ,num,a,b;
scanf("%d",&num);
while(num--)
{
scanf("%d%d",&n,&m);
memset(Map,0,sizeof(Map));
for(int i = 0 ; i < m; i ++)
{
scanf("%d%d",&a,&b);
Map[a][b]=1 ;
}
printf("%d\n",n-hungary());
}
}