题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3118
思路:题目要求是去掉最少的边使得图中不存在路径长度为奇数的环,这个问题等价于在图中去掉若干条边,使得这个图成为二分图。注意到n不是很大,于是我们可以想到二进制枚举,枚举每条边的两个顶点是否在同一个集合中,若是,则删除这条边。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define inf 1<<30 8 vector<pair<int,int> >map; 9 int n,m; 10 11 int main() 12 { 13 // freopen("1.txt","r",stdin); 14 int _case,u,v,ans,count; 15 scanf("%d",&_case); 16 while(_case--){ 17 scanf("%d%d",&n,&m); 18 map.clear(); 19 for(int i=0;i<m;i++){ 20 scanf("%d%d",&u,&v); 21 map.push_back(make_pair(u,v)); 22 } 23 ans=inf; 24 for(int i=0;i<(1<<n);i++){ 25 count=0; 26 for(int j=0;j<m;j++){ 27 if(((i>>map[j].first)&1)==((i>>map[j].second)&1)) 28 count++; 29 } 30 if(count<ans)ans=count; 31 } 32 printf("%d\n",ans); 33 } 34 return 0; 35 }