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;}


原创粉丝点击