int lef[N*N];//lef[v]表示右邊點v 當前連接的點
bool T[N*N];//右邊的點是否連過
vector<int>G[N];//G是映射,G[X集].push_back(Y集) 注意G的初始化
bool match(int x)
{
for(int i=0;i<G[x].size();i++)
{
int v=G[x][i];
if(!T[v])
{
T[v]=true;
if(lef[v]==-1||match(lef[v]))
{
lef[v]=x;
return true;
}
}
}
return false;
}
void solve()
{
int ans=0;
memset(lef,-1,sizeof(lef));
for(int i=0;i<pn-1;i++)//左右點集匹配,左點集是 0-(pn-1) 右點集是G[左點].size()
{
memset(T,0,sizeof(T));
if(match(i))ans++;
}
printf("%d\n",ans);
}