问题描述
每个人都有手性,左手或右手。事实上,所有的人都必须和具有相同手性的食物生活在一起。当一个人把仲裁者从一颗恒星带到另一颗恒星时,他的手性就会发生变化(从左手变成右手,或者从右手变成左手)。然而,如果一个人走了很长一段路,最终回到了自己的星球,那么他的手性可能会发生改变,变成与原来相反的状态,这将会导致致命的精神障碍,甚至死亡。
意思就是从自己的星球出发然后回到自己的星球,必须是走的边是偶数。
KMXS在恒星之间有通道图,他需要禁止最小数量的通道旅行,这样当一个人得到他的恒星时,无论他从哪里开始旅行,他都是安全的。KMXS求助于你。
输入
第一行输入包含一个整数T,表示测试用例的数量。
每种情况的第一行由两个整数N和M组成,表示星星的数量和通道的数量。接下来的M行每一行表示一个通道(u, v)这意味着在星u和星v之间有一个双向通道(u不等于v)
输出
为每种情况在单行上输出一个整数,表示为避免精神障碍,KMXS必须禁止的最小通道数。
0 < T <= 10
0 <= N <= 15 0 <= M <= 300
0 <= u, v < N,两颗恒星之间可能有多个通道。
Sample Input
1
3 3
0 1
1 2
2 0
Sample Output
1
二分图的性质就是这样的都是偶数边。故这个题可以转化为最小删除几条边可以将这个无向图分成两部分,变成二分图。
枚举每个图中的点是在二分图的左边还是右边。
将左边内部之间的边删除,右边内部之间的边删除。
由于n不是很大。采用二进制枚举。
邻接矩阵和邻接表的代码都贴一下。
#include <cstring>
#include <algorithm>
#define m(a,b) memset(a,b,sizeof a)
typedef long long ll;
using namespace std;
const int N=155;
const int INF=0x3f3f3f3f;
struct Edge{
int from,to;}edge[N*N];
int tot,n,m;
template<class T>void rd(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {
f|=(ch=='-'