13 30 11 22 0 Sample Output1 Source2009 Asia Wuhan Regional Contest Online题目大意:
给你一张有向图,问你最少删除的边数使得图中没有奇数环,即环的点数为奇数(1除外)
题目思路:
首先我们看看二分图的定义:无向图G=<V,E>为二分图的充要条件是G的所有回路的长度均为偶数。
所以我们可以利用二分图的性质来做这题,首先我们可以利用二进制的来枚举他的所有二分图的组合,二进制中1和0分别属于不同的集合,然后我们在枚举同一集合当中的点是否存在边,如果存在边就删掉该边,然后在记录删除的次数,最后取个最小值就是我们要求的答案
AC代码:
#include<cstring>#include<cstdio>#define min(x,y) (x<y?x:y)int mp[20][20];int n,m;int sove(int k){ int num=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if((1&(k>>i))==(1&(k>>j))&&mp[i][j])num+=mp[i][j]; //枚举所有同一集合的点的组合看是否有边 } } return num;}int main(){ int t;scanf("%d",&t); while(t--){ memset(mp,0,sizeof(mp)); scanf("%d%d",&n,&m); while(m--){ int u,v;scanf("%d%d",&u,&v); mp[u][v]++,mp[v][u]++; //记录边出现的次数 } int ans = 1e8; for(int i=1;i<(1<<n);i++){ //枚举所有状态 ans=min(ans,sove(i)); //取所有状态的最小值 } if(ans==1e8)ans=0; printf("%d/n",ans); } return 0;}
新闻热点
疑难解答