洛谷 P6268 [SHOI2002]舞会(二分图最大独立集)
admin
2024-02-28 21:39:07

[SHOI2002]舞会

题目描述

某学校要召开一个舞会。已知学校所有 nnn 名学生中,有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上,要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多少个学生参加。

输入格式

输入的第一行是 nnn 和 mmm 。其中 nnn 是可选的学生的总数, mmm 是已知跳过舞的学生的对数 ( n≤1000n \leq 1000n≤1000 , m≤2000m \leq 2000m≤2000 )。

然后有 mmm 行,每行包括两个非负整数,表示这两个编号的学生曾经跳过舞。学生的编号从 000 号到 n−1n - 1n−1 号。

输出格式

输出文件仅一行,为一个数字,即能够邀请的最多的学生数。

样例 #1

样例输入 #1

8 6
0 2
2 3
3 5
1 4
1 6
3 1

样例输出 #1

5

样例 #2

样例输入 #2

20 5
5 2
4 3
18 17
0 11
13 3

样例输出 #2

16
1、 二分图最大独立集的大小 = n - 最大匹配数
2、 我们可以考虑将这些跳过舞的人构建二分图,并通过匈牙利算法求出匹配对数。 而在二分图中一对匹配对应的是两个人,我们用总人数减去已参与匹配的人数
3、 由于配对会重复(即会出现match[a]=b,match[b]=a的情况),所以注意最后输出的是n-(ans/2)
#include 
using namespace std;
const int N = 1e3 + 10, M = 1e6 + 10;
int mp[N][N];
int n, m;
int head[N], ver[M], Next[M];
int tot;
bool vis[N];
int match[N];void add(int x, int y)
{ver[++tot] = y, Next[tot] = head[x], head[x] = tot;
}bool dfs(int x)
{for(int i = head[x], y; i; i = Next[i]){y = ver[i];if(!vis[y]){vis[y] = true;if(!match[y] || dfs(match[y])){match[y] = x;return true;}}}return false;
}int main()
{scanf("%d%d", &n, &m);int x, y;while(m--){scanf("%d%d", &x, &y);if(x > y) swap(x, y);mp[x + 1][y + 1] = 1;}for(int i = 1; i <= n; ++i){for(int j = i + 1; j <= n; ++j){if(mp[i][j]){add(i, j); add(j, i);		}}}int ans = 0;for(int i = 1; i <= n; ++i){memset(vis, false, sizeof vis);if(dfs(i)){++ans;	}}printf("%d\n", n - ans / 2);return 0;
}

相关内容

热门资讯

德州早报(1月25日)——降雪... 转自:德州发布Hi早上好,一起听新闻▶ 新华社转发!“长兄如父 长嫂如母”具象化了!父亲早逝、母亲患...
寒冬特巡保供电 转自:贵州日报南方电网贵州毕节供电局工作人员对110千伏赫韭线开展特殊巡视工作。 海拔2500米的毕...
“他们真的好贴心” 转自:贵州日报 “来啦,来啦。我就知道你们俩今天一大早肯定会来。”清晨薄雾中,黔东南州天柱县渡马镇龙...
七大任务筑牢水安全屏障 转自:贵州日报 本报讯(记者 张弘弢)1月22日,2026年全省水利工作会议在贵阳召开,明确提出到2...
潘吉得:钢盆为“号”引导村民安... 转自:贵州日报 贵州日报天眼新闻记者 陈玉林2025年6月24日凌晨,一场突如其来的灾难打破了黔南州...