洛谷 P6268 [SHOI2002]舞会(二分图最大独立集)

news/2024/11/17 7:35:30/

[SHOI2002]舞会

题目描述

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

输入格式

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

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

输出格式

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

样例 #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 <bits/stdc++.h>
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;
}

http://www.ppmy.cn/news/177072.html

相关文章

[HDU6268]Master of Subgraph

[HDU6268]Master of Subgraph 题目大意&#xff1a; 一棵\(n(n\le3000)\)个结点的树&#xff0c;每个结点的权值为\(w_i\)。给定\(m(m\le10^5)\)&#xff0c;对于任意\(i\in[1,m]\)&#xff0c;问书中是否有一个连通子图的权值和等于\(i\)。 思路&#xff1a; 重心剖分。考虑处…

【力扣周赛#324】6266. 使用质因数之和替换后可以取到的最小值+6267. 添加边使所有节点度数都为偶数+6268. 查询树中环的长度

目录 6265. 统计相似字符串对的数目 - ac 6266. 使用质因数之和替换后可以取到的最小值 分解质因数 1、tle代码 2、优化ac代码 6267. 添加边使所有节点度数都为偶数 - 建图分类讨论 关于建图 6268. 查询树中环的长度 - LCA最近公共祖先 6265. 统计相似字符串对的数目…

LOJ6268拆分数

/*相当于每种物品都有无限个的背包毕竟考场上写exp是个比较危险的行为对数据进行根号分治是个比较好的方法对于小于等于根号的部分暴力背包转移 对于大于根号的 最多只会拿根号个 dp一下就好了*/ #include<cstdio> #include<algorithm> #include<cstring> #i…

UVALive - 6268 Cycling 贪心

UVALive - 6268 Cycling 题意&#xff1a;从一端走到另一端&#xff0c;有T个红绿灯&#xff0c;告诉你红绿灯的持续时间&#xff0c;求最短的到达终点的时间。x 思路&#xff1a; 转载于:https://www.cnblogs.com/macinchang/p/4753611.html

LOJ #6268. 分拆数

可以先将问题建模为 &#xff1a; 物品大小为1~inf 且每件物品数量无限 的背包选体积为1~n的方案数。 显然物品体积只有1~n有用&#xff0c;我们不妨把 体积1~sqrt(n) 的物品先暴力插入到背包中&#xff0c;设这一部分最后 体积i的方案数是 A[i] 。 考虑体积>sqrt(n)的物品怎…

[HDU6268]Master of Subgraph 树分治+bitset

bitset用法 bitset<B_Length> array[A_SIZE] 创建一个长度为B_Length,大小为A_SIZE的数组 bitset<B> a(n) 初始化一个值为n的bitset .reset() 将所有位初始化为0 .set() …

Hdu 6268 点分治 树上背包 bitset 优化

给你一颗大小为n(3000)的树,树上每个点有点权(100000),再给你一个数m(100000) i为1~m,问树中是否存在一个子图,使得权值为i. 每次solve到一个节点 用一个bitset维护所有经过它的链的取值(calc前要先初始化当前节点的bitset) 复杂度为nlognm/64 #include <bits/stdc.h> us…

HDU 6268 Master of Subgraph (2017CCPC杭州 E)分治+bitset优化

题目传送门 题意&#xff1a;给你一颗n(<3e3)个点的无向树&#xff0c;再给你一个数m(<1e5)&#xff0c;再给你n个点的权值a[i](<1e5) 求对于每个x属于[1,m]&#xff0c;是否存在一个连通子图的权值和正好为x。输出一个长度为m的01串&#xff0c;第i个位置上的数字表…