hdu 3118 【关于二分图】
来源:互联网 发布:抢单软件 编辑:程序博客网 时间:2024/06/06 09:13
/*根据题意,本题要求为图中不能出现奇数环由此想到二分图的性质:图中的点分为两个集合,一个集合中的点只有另一个集合有连边,而不与自身集合内的点有连边,因为只有两个集合,所以要形成环必须为偶数条边一共最多有15个点,所以最多有2^15次方种情况*/#include<cstdio>#include<cmath>#include<cstring>#include<iostream>using namespace std;int mapp[17][17];int main(){ int t; scanf("%d",&t); int n,m; while(t--) { scanf("%d%d",&n,&m); if(n==0) { printf("0\n"); continue; } int u,v; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) mapp[i][j]=0; } for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); if(u>v) swap(u,v); mapp[u][v]++;//建立邻接矩阵,为了方便查找,且由于是双向边,故换位置 } int maxx=1<<n; int res=0x7fffffff; int flag[20]; for(int i=0;i<maxx;i++)//转化成二进制进行比较 { memset(flag,0,sizeof(flag)); for(int j=0;j<n;j++)//二进制 { if(i&(1<<j))//每个数&一个该位的二进制表达,例如,6&1=0,5&2=1,5&4=1,所以6的格式110 flag[j]=1; //cout<<flag[j]; } // cout<<endl; int tmp=0; for(int j=0;j<n;j++)//比较是否为同一个集合,如果同一个集合还有连边,就是错误的 { for(int k=j+1;k<n;k++) { if(flag[k]==flag[j]) tmp+=mapp[j][k];//即使属于同一个集合,如果是没有连边,那么mapp也是0 } } res=min(res,tmp); } printf("%d\n",res); } return 0;}