这个题目谁要是在比赛的时候没出,后来肯定后悔死了
首先题目意思很简单,就是让你去掉图中最少边数,让整个图中任意两点之间的距离是偶数
也就是图不存在奇圈
这个很容易想到二部图,考虑到数据量很小,那么现在就可以枚举,怎么枚举呢,把整个图枚举分成两部分
然后去除同一集合里面的连边,这里枚举是用二进制枚举,0代表一个集合,1代表一个集合,然后遍历所有
的边,如果边的两个端点在一个集合内,那么直接去除,选最小的
这里得到一个教训 &位运算的结果是整型,判断相等要用bool类型强制转换一下才能得到bool相等
(bool((1<<po[j].x)&i))==(bool((1<<po[j].y)&i))
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define maxn 305
int n,m;
struct point
{
int x;
int y;
}po[maxn];
int main()
{
int t;
int i,j,ans,re_ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
scanf("%d%d",&po[i].x,&po[i].y);
ans=m;
for(i=0;i< (1<<n);i++)
{
re_ans=0;
for(j=0;j<m;j++)
{
if((bool((1<<po[j].x)&i))==(bool((1<<po[j].y)&i)))
re_ans++;
}
if(ans > re_ans)
ans=re_ans;
}
printf("%d\n",ans);
}
return 0;
}