#include<cstdio>
#include<cstring>
int G[460][460];
int vis[460],num1[260],num2[260];
int n,tot,dp[260][260];
void dfs(int to)
{
vis[to]=1;
if(to<=n)
num1[tot]++;
else
num2[tot]++;
for(int i=1;i<=2*n;i++)
if(!vis[i]&&G[to][i])
dfs(i);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int q;
scanf("%d%d",&n,&q);
memset(G,0,sizeof(G));
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
G[a][b+n]=G[b+n][a]=1;
}
memset(vis,0,sizeof(vis));
tot=0;
for(int i=1;i<=2*n;i++)
if(!vis[i])
{
num1[tot]=num2[tot]=0;
dfs(i);
tot++;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int k=0;k<tot;k++)
for(int i=n/2;i>=0;i--)
for(int j=n/2;j>=0;j--)
if(i-num1[k]>=0&&j-num2[k]>=0&&dp[i-num1[k]][j-num2[k]])
dp[i][j]=1;
int res=n/2;
for(int i=n/2;i>=0;i--)
if(dp[i][i])
{
res=i;
break;
}
printf("%d\n",res);
}
}
poj 1636 DP
最新推荐文章于 2020-02-12 15:55:55 发布