hdu2444 染色法+二分图匹配

有n个关系,他们之间某些人相互认识。这样的人有m对。
你需要把人分成2组,使得每组人内部之间是相互不认识的。
如果可以,就可以安排他们住宿了。安排住宿时,住在一个房间的两个人应该相互认识。
最多的能有多少个房间住宿的两个相互认识。

首先题目是要问能不能分成两组,每组人之间互相不认识,每个人只与对面那部分的人认识。这个就是要判断是不是能构成一个二分图的样子。
判断二分图我们使用染色法,就是规定一个点的颜色,然后与其相连的点的颜色是不同的,如果遇到了无法满足的情况,(比如之前颜色是1 , 但是到现在你又要这个点颜色是2就无法满足)。判断是二分图后,直接二分图匹配模板就可以了。还有个小问题就是,我们二分图匹配出来的数目要除以2,因为他是比如1和2匹配,2和1匹配算作了两种,所以答案去除以2就好了。
有任何问题尽管留言,我会尽量回复。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<time.h>
#include<cmath>
using namespace std;
const long long max_ = 1e3 + 7;
int tu[max_][max_];
int read()
{
	int s = 0, f = 1;
	char ch = getchar();
	while (ch<'0' || ch>'9') {
		if (ch == '-')
			f = -1;
		ch = getchar();
	}
	while (ch >= '0'&&ch <= '9') {
		s = s * 10 + ch - '0';
		ch = getchar();
	}
	return s * f;
}

int n, m, e, vis[max_], match[max_];
int dfs(int now) {
	for (int i = 1; i <= n; i++) {
		if (tu[now][i] && !vis[i]) {
			vis[i] = 1;
			if (match[i] == 0 || dfs(match[i])) {
				match[i] = now;
				return 1;
			}
		}
	}
	return 0;
}
int color[max_];
int bfs(int now) {
	queue<int>node;
	node.push(now);
	while (!node.empty()) {
		int tou = node.front();
		node.pop();
		for (int i = 1; i <= n; i++) {
			if (tu[tou][i] == 1) {
				if (color[i] == 0) {
					color[i] = (color[tou] == 1 ? 2 : 1);
					node.push(i);
				}
				else {
					if (color[i] == color[tou])return 0;
				}
			}
		}
	}
	return 1;
}
void qing() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			tu[i][j] = 0;
		}
		match[i] = 0;
		color[i] = 0;
	}
}
int main() {
	while (scanf_s("%d%d", &n,&m)!=EOF) {
		qing();
    while (m--) {
		int a = read(), b = read();
		tu[a][b] = 1;
		tu[b][a] = 1;
	}
	int sum = 0;
	color[1] = 1;
	if (!bfs(1)||n==1) { cout << "No" << endl; continue; }
	for (int i = 1; i <= n; i++) {
		memset(vis, 0, sizeof(vis));
		sum += dfs(i);
	}
	cout << sum/2 << endl;	
	}
	
	return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11166次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1975次浏览 42人参与
# 巨人网络春招 #
11381次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7656次浏览 43人参与
# 简历第一个项目做什么 #
31761次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433583次浏览 3926人参与
# 米连集团26产品管培生项目 #
6050次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187235次浏览 1122人参与
# 牛客AI文生图 #
21453次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152480次浏览 888人参与
# 研究所笔面经互助 #
118978次浏览 577人参与
# 简历中的项目经历要怎么写? #
310397次浏览 4220人参与
# AI时代,哪些岗位最容易被淘汰 #
63899次浏览 828人参与
# 面试紧张时你会有什么表现? #
30521次浏览 188人参与
# 你今年的平均薪资是多少? #
213162次浏览 1039人参与
# 你怎么看待AI面试 #
180188次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64340次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76557次浏览 374人参与
# 我的求职精神状态 #
448159次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363553次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160687次浏览 1112人参与
# 校招笔试 #
471293次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务