hdu3118(二分图位判断)

题意是给n个点,m条两两之间的连线

想要得到一个二分图,那肯定要删边,问最少删几条

把所有可能的情况列出来,有2^n种,然后一个个判断要删几条边,找最小值


用位于的方法找,1<=k<=2^n,这意味这k的二进制一一零零的囊括了将点划分为两个阵营的所有情况

接下来对于一个k,遍历每条边,如果两个点i,i都同为1阵营或者同为0阵营,ans+map[i][j](不需要判断map是否为0直接+就行了,开头初始化就好

注意m==0||n==0,因为这个wa



//

//  main.cpp

//  4.E

//

//  Created by Mr.Xue on 17/7/15.

//  Copyright © 2017 Mr.Xue. All rights reserved.

//


#include <iostream>

#include <string.h>

#include <stdio.h>

using namespacestd;

int n,m;

int map[200][200];

int erfen(int k)

{

    int sum=0;

    for(int i=0;i<n;i++)

    {

        for(int j=i+1;j<n;j++)

        {

            if((k&(1<<i))==0&&(k&(1<<j))==0)

                sum+=map[i][j];

            elseif((k&(1<<i))!=0&&(k&(1<<j))!=0)

                sum+=map[i][j];

        }

    }

    return sum;

}

int main()

{

    int t,x,y;

    cin>>t;

    

    while(t--)

    {

        scanf("%d %d",&n,&m);

        

        memset(map,0,sizeof(map));

        for(int i=0;i<m;i++)

        {

            scanf("%d %d",&x,&y);

            map[x][y]++;

            map[y][x]++;

        }

        if(n==0||m==0)

            printf("0\n");

        else

        {

            int min=99999,ans;

            for(int k=1;k<(1<<n)-1;k++)

            {

                ans=erfen(k);

                if(min>ans)

                    min=ans;

            }

            printf("%d\n",min);

        }

        

    }

    return0;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值