AtCoder Regular Contest 099 (ARC099) E - Independence 二分图
原文链接https://www.cnblogs.com/zhouzhendong/p/9224878.html
题目传送门 - ARC099 E - Independence
题意
给定一个有 $n$ 个节点, $m$ 条边的无向图,保证没有自环和重边。
请你把所有的 $n$ 个节点分成两组,同组中的任意两个节点之间都有边直接连接。
问连接同组节点的总边数最小为多少?如果不存在合法的划分方案,则输出 $-1$ 。
数据范围: $n\leq 700, 0\leq m\leq \cfrac{n(n-1)}2 $
题解
考虑到同组节点必须形成完全子图,这个性质和二分图恰好相反。
所以我们考虑在其补图上找一个二分图,并求出这个二分图两侧节点数有哪些可能。
对于每一个连通分量,我们进行黑白染色。如果不支持黑白染色,那么输出 $-1$ 。
(假设最终的二分图分为左右两侧)
记两种颜色的节点个数分别为 $x,y$ ,那么,既可以把 $x$ 个节点放入左侧,也可以把 $y$ 个节点放入左侧。
所有的连通分量的结果综合一下,变成一个背包问题,我用了 $DP$ ,然后赛后看大神们直接用 $bitset$,方便极了。
对于得到的所有可能的左侧节点数,我们算一下答案取 $min$ 即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2005;
int n,m;
int g[N][N];
int dp[N],e[N],vis[N],x,y,f=0;
void dfs(int p,int t){
if (vis[p]){
if (vis[p]!=t+1)
f=1;
return;
}
vis[p]=t+1;
if (t)
x++;
else
y++;
for (int i=1;i<=n;i++)
if (i!=p&&!g[p][i])
dfs(i,t^1);
}
int calc(int x){
return x*(x-1)/2;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1,a,b;i<=m;i++){
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=1;
}
memset(dp,0,sizeof dp);
dp[0]=1;
for (int i=1;i<=n;i++){
if (vis[i])
continue;
x=0,y=0;
dfs(i,0);
memset(e,0,sizeof e);
for (int j=n;j>=0;j--)
e[j+x]|=dp[j],e[j+y]|=dp[j];
for (int j=0;j<=n;j++)
dp[j]=e[j];
}
if (f){
puts("-1");
return 0;
}
int ans=n*n*2;
for (int i=0;i<=n;i++)
if (dp[i])
ans=min(ans,calc(i)+calc(n-i));
printf("%d",ans);
return 0;
}
AtCoder Regular Contest 099 (ARC099) E - Independence 二分图的更多相关文章
- AtCoder Regular Contest 099
AtCoder Regular Contest 099 C - Minimization 题意 题意:给出一个n的排列.每次操作可以使一段长度为K的连续子序列变成该序列的最小数.求最少几次使得整个数列 ...
- AtCoder Regular Contest 099 C~E
C - Minimization 枚举就可以了 因为最后一定会变成1,所以第一次操作的区间就包含1会比较优,然后枚举1在第一次操作区间里排第几个取min即可 #include<iostream& ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
- AtCoder Regular Contest 095
AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...
- AtCoder Regular Contest 102
AtCoder Regular Contest 102 C - Triangular Relationship 题意: 给出n,k求有多少个不大于n的三元组,使其中两两数字的和都是k的倍数,数字可以重 ...
随机推荐
- SQL Server循环
1.普通循环 DECLARE @i int BEGIN WHERE Uid=@i --PRINT @i END 2.游标循环(没有事务) ---游标循环(没有事务) BEGIN DECLARE @a ...
- [PHP]一些坑
一.如果有一个字符串变量等于'error',它跟0 == 运算时,会返回true,但是它并不是一个预置常量 $test = 'error'; var_dump($test == 0);//true 二 ...
- python相关的安装软件
本次安装的系统是WINDOWS系统 一.python3.anaconda和python2 1.准备工具:python3.python2安装包可以直接从官网下载https://www.python.or ...
- 树·二叉查找树ADT(二叉搜索树/排序树)
1.定义 对于每个节点X,它的左子树中所有的项的值小于X的值,右子树所有项的值大于X的值. 如图:任意一个节点,都满足定义,其左子树的所有值小于它,右子树的所有值大于它. 2.平均深度 在大O模型中, ...
- 纯webpack打包项目
webpack 3 零基础入门教程 http://webpackbook.rails365.net/466996(文本) https://www.rails365.net/movies/webpack ...
- Swift 学习- 03 -- 基本运算符
// 运算符是检查,改变,合并值的特殊符号或短语, // swift 支持大部分标准的 C语言的运算符, 且改进许多特性来减少常规编码错误. /* 如: 赋值符 (=) 不返回值, 以防止把想要判断相 ...
- Confluence 6 附件存储配置
在默认的情况下 Confluence 的附件存储在 home 目录中(例如,在文件系统). 希望对 Confluence 的附件存储进行配置: 在屏幕的右上角单击 控制台按钮 ,然后选择 Genera ...
- 通过$broadcast或$emit在子级和父级controller之间进行值传递
通过$broadcast或$emit在controller之间进行值传递,不过这些controller必须是子级或者父级关系, $emit只能向父级parent controller传递事件event ...
- Client-Side Attacks
1.之前看到中间人攻击方式,要使用ssl服务构架一个劫持会话,使得攻击者和被攻击者客户端连接.ssl 服务(secure Socket Layer安全套接) ,以及后续出现的TSL(Transport ...
- cut sticks
问题 : cut sticks 时间限制: 1 Sec 内存限制: 128 MB 题目描述 George took sticks of the same length and cut them ra ...