P6268 [SHOI2002]舞会 题解

news/2024/11/17 6:43:18/

博客园同步

原题链接

前置知识:

匈牙利算法

简要题意:

求图的二分图最大独立集。

二分图最大独立集指:最大的一个点集使得每两个点都不在同一边上的这个点集的大小。

你会发现,这和 二分图最大匹配 似乎是有联系的。

给出恒等式:

二分图最大独立集 = 图的点数 - 最小点覆盖 = 图的点数 - 最大匹配。

最小点覆盖指:最小的一个点集使得每一条边至少有一个端点在该点集中。

你会发现,最小点覆盖和最大匹配本质没有区别。你选边满足边不共点,就是选点满足每边有点啊。

所以,求一遍最大匹配然后减一下即可。

  • 细节

匈牙利算法的模板似乎从 1 1 1 ~ n n n 扫一遍能过(尽管它题目说 的是 0 0 0 ~ n − 1 n-1 n1),但是这题不行。所以,我们要考虑 0 0 0 的话,就得给 vis \text{vis} vis mat \text{mat} mat 赋值为 − 1 -1 1.

时间复杂度: O ( n × m ) O(n \times m) O(n×m).

实际得分: 100 p t s 100pts 100pts.

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;const int N=2e3+1;inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}int n,m,T,vis[N],mat[N];
vector<int>G[N]; bool h[N];inline bool dfs(int dep,int bs) {if(vis[dep]==bs) return 0;vis[dep]=bs;for(int i=0;i<G[dep].size();i++) {int x=G[dep][i];if(mat[x]==-1 || dfs(mat[x],bs)) {mat[x]=dep;return 1;}} return 0;
}int main(){n=read(),T=read();while(T--) {int x=read(),y=read();G[x].push_back(y);} int ans=0;memset(mat,-1,sizeof(mat));memset(vis,-1,sizeof(vis));for(int i=0;i<n;i++)if(dfs(i,i)) ++ans;printf("%d\n",n-ans);	return 0;
}

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

相关文章

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

[SHOI2002]舞会 题目描述 某学校要召开一个舞会。已知学校所有 n n n 名学生中&#xff0c;有些学生曾经互相跳过舞。当然跳过舞的学生一定是一个男生和一个女生。在这个舞会上&#xff0c;要求被邀请的学生中的任何一对男生和女生互相都不能跳过舞。求这个舞会最多能邀请多…

[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…