hdu 3118(二进制枚举)

时间:2022-05-15 09:28:06

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3118

思路:题目要求是去掉最少的边使得图中不存在路径长度为奇数的环,这个问题等价于在图中去掉若干条边,使得这个图成为二分图。注意到n不是很大,于是我们可以想到二进制枚举,枚举每条边的两个顶点是否在同一个集合中,若是,则删除这条边。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 1<<30
vector<pair<int,int> >map;
int n,m; int main()
{
// freopen("1.txt","r",stdin);
int _case,u,v,ans,count;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
map.clear();
for(int i=;i<m;i++){
scanf("%d%d",&u,&v);
map.push_back(make_pair(u,v));
}
ans=inf;
for(int i=;i<(<<n);i++){
count=;
for(int j=;j<m;j++){
if(((i>>map[j].first)&)==((i>>map[j].second)&))
count++;
}
if(count<ans)ans=count;
}
printf("%d\n",ans);
}
return ;
}