两个点集,个数都为n,求出最大匹配,然后除以2
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#define maxn 5005
#define LL long long
using namespace std;
int n;
vector<int> G[maxn];
int lx[maxn],ly[maxn];
bool vis[maxn];
bool DFS(int u)
{
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!vis[v])
{
vis[v]=1;
if(ly[v]==0 || DFS(ly[v]))
{
ly[v]=u;
lx[u]=v;
return true;
}
}
}
return false;
}
int match()
{
int ans=0;
for(int i=1;i<=n;i++)
{
if(lx[i]==0)
{
for(int j=0;j<=n;j++)
vis[j]=0;
if(DFS(i))
ans++;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
G[i].clear();
for(int i=0;i<=n;i++)
lx[i]=0,ly[i]=0;
int m=n*3/2;
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
printf("%d\n",match()/2);
}
return 0;
}