hdu_3118 Arbiter 二分图匹配性质

来源:互联网 发布:五五开笑笑知乎 编辑:程序博客网 时间:2024/05/22 13:54
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 310int a[N],b[N];int hash1[N];int main(){    int t,n,m;    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&m);        for(int i=0;i<m;i++)            scanf("%d%d",&a[i],&b[i]);        int minn=0x7f7f7f7f;        for(int i=0;i<(1<<n);i++){            int ans=0;            for(int j=0;j<n;j++){                if(i&(1<<j)) hash1[j]=1;                else hash1[j]=0;            }            for(int j=0;j<m;j++){                if(hash1[a[j]]==hash1[b[j]]) ans++;            }            minn=min(minn,ans);        }        printf("%d\n",minn);    }    return 0;}
//比赛时知道了这题的意思。。就是破坏奇数环,用dfs做,每找到一个奇数环就去掉重边最少的。。结果wrong!没
考虑到有公共边的情况。。
赛后听说是二分图的性质。。如果形成二分图,那么形成的环一定不会有奇环,等价于在图中去掉若干条边,使得这个图成为 
二分图。
然后就是做法的问题了,对于n个点组成二分图,每个点可以属于两个集合的任何一个,有1<<n中情况
然后判断这种情况下需要去掉边的个数,对于这1<<n中状态选出最小的即可
原创粉丝点击