Arbiter HDU - 3118 利用二分图定义,枚举每一种状态

//构建二分图
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
const int N=155;
const int INF=0x3f3f3f3f;
struct Edge {
	int from,to;
} edge[N*N];
int tot,n,m;
int read() {
	int res=0,ch,flag=0;
	if((ch=getchar())=='-')             //判断正负
		flag=1;
	else if(ch>='0'&&ch<='9')           //得到完整的数
		res=ch-'0';
	while((ch=getchar())>='0'&&ch<='9')
		res=res*10+ch-'0';
	return flag?-res:res;
}
int delete_num() {
	int minn=INF;
	//枚举每种状态
	//每个点,在二分图中的那一边
	for(int i=0; i<(1<<n); ++i) {
		int ans=0;
		for(int j=2; j<=tot; ++j) { //每条边。
			int x=edge[j].from,y=edge[j].to;
			if( ( (i>>x)&1)==( (i>>y)&1) )    //假如每条边的左右两点在二分图的一边,删除这条边。
				++ans;
		}
		if(minn>ans)
			minn=ans;
	}
	return minn;
}
int main() {
	int T;
	T=read();
	while(T--) {
		tot=1;
		n=read(),m=read();
		while(m--) {
			int x,y;
			x=read(),y=read();
			edge[++tot]=(Edge) {
				x,y
			};
		}
		printf("%d\n",delete_num());
	}
}

posted @ 2020-03-03 15:59  晴屿  阅读(89)  评论(0编辑  收藏  举报