题意是给n个点,m条两两之间的连线
想要得到一个二分图,那肯定要删边,问最少删几条
把所有可能的情况列出来,有2^n种,然后一个个判断要删几条边,找最小值
用位于的方法找,1<=k<=2^n,这意味这k的二进制一一零零的囊括了将点划分为两个阵营的所有情况
接下来对于一个k,遍历每条边,如果两个点i,i都同为1阵营或者同为0阵营,ans+map[i][j](不需要判断map是否为0直接+就行了,开头初始化就好
注意m==0||n==0,因为这个wa
//
// main.cpp
// 4.E
//
// Created by Mr.Xue on 17/7/15.
// Copyright © 2017年 Mr.Xue. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespacestd;
int n,m;
int map[200][200];
int erfen(int k)
{
int sum=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if((k&(1<<i))==0&&(k&(1<<j))==0)
sum+=map[i][j];
elseif((k&(1<<i))!=0&&(k&(1<<j))!=0)
sum+=map[i][j];
}
}
return sum;
}
int main()
{
int t,x,y;
cin>>t;
while(t--)
{
scanf("%d %d",&n,&m);
memset(map,0,sizeof(map));
for(int i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
map[x][y]++;
map[y][x]++;
}
if(n==0||m==0)
printf("0\n");
else
{
int min=99999,ans;
for(int k=1;k<(1<<n)-1;k++)
{
ans=erfen(k);
if(min>ans)
min=ans;
}
printf("%d\n",min);
}
}
return0;
}