题意:删除给出的图中的最少的边,让图无奇数边的环
二分图的定义:至少含有2个点,如果有环,环必须是偶数的边。
二分图如果分成两个部分,比如X,Y两部分,我们知道两部分之间是有边相连的,但是同一部分之间的点是没有边相连的。
所以,结合以上的知识,我们枚举,把图的点分为2个部分,只要把同一部分的点之间的边删掉,那么最后剩下的图就是二分图,就是满足题意的图,枚举过程记录最小值
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
#define lson (rt<<1),L,M
#define rson (rt<<1|1),M+1,R
#define M ((L+R)>>1)
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define fread(zcc) freopen(zcc,"r",stdin)
#define fwrite(zcc) freopen(zcc,"w",stdout)
using namespace std;
const int maxn=25;
const int inf=999999;
int a[maxn][maxn];
int n;
int work(int k){
int ans=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)ans+=a[i][j];
else if((k&(1<<i))!=0&&(k&(1<<j))!=0)ans+=a[i][j];
}
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int m;
scanf("%d%d",&n,&m);
cl(a,0);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
a[u][v]++,a[v][u]++;
}
if(n==0||m==0){
puts("0");continue;
}
int ans=inf;
for(int i=1;i<(1<<n);i++){
ans=min(ans,work(i));
}
printf("%d\n",ans);
}
return 0;
}