[多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包)

题面

在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为两组进行,且每一组中任意两个蓝精灵都是好友。另外,他们还想要最小化每组蓝精灵内部的好友关系数之和。蓝精灵们怎么都想不到如何分组来进行游戏,所以找到你来帮助他们分组。(若第一组内部的好友关系数为 cnt1,第二组内部的好友关系数为 cnt2,则“每组蓝精灵内部的好友关系数之和”为 cnt1+cnt2)

\(n \leq 700\)

分析

实际上就是将一个图分成两个子图,使得每一个子图都是完全图。注意到没有边直接相连的点不能放在一个子图里。因此建原图的补图。那么补图中有边相连的点不能放在一个子图里。看到这个条件,我们想到了二分图染色。

于是我们对补图二分图染色。发现同一个联通块里相同颜色的点一定在同一个子图里。不同联通块里的两个点无论颜色都可以在一个子图里。

那么我们就可以预处理出\(f[i]\)表示是否存在一种分组方式使得某组的蓝精灵数为\(i\).具体方法是对于每个联通块,我们求出两种颜色的个数\(cnt[1],cnt[2]\),那么类似背包问题,可以用\(f[i]\)来更新\(f[i+cnt[1]],f[i+cnt[2]]\).注意要用滚动数组。

最后对于所有满足\(f[i]=1\)的\(i\),求边数最小值即可

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 700
using namespace std;
int n,m;
int g[maxn+5][maxn+5];
int invg[maxn+5][maxn+5];//反图
int col[maxn+5];
int cnt[5];
void dfs(int x,int c){
col[x]=c;
cnt[c]++;
for(int y=1;y<=n;y++){
if(y!=x&&g[x][y]==0){
if(!col[y]) dfs(y,3-c);
else if(col[y]==c){
printf("-1\n");
exit(0);
}
}
}
} inline int get_e(int x){
return x*(x-1)/2;
} int f[2][maxn+5];
//类似背包,记录能不能凑出一组点数为i的子图
int main(){
int u,v;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d",&u,&v);
g[u][v]=1;
g[v][u]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j&&!g[i][j]) invg[i][j]=1;
}
}
int now=1;
f[1][0]=1;
for(int i=1;i<=n;i++){
if(!col[i]){
cnt[1]=cnt[2]=0;
dfs(i,1);
for(int j=0;j<=n;j++){
f[now^1][j+cnt[1]]|=f[now][j];
f[now^1][j+cnt[2]]|=f[now][j];
}
now^=1;
//同一个二分图联通块里,不同颜色的点不能放一起
}
}
int ans=INF;
for(int i=1;i<n;i++){
if(f[now][i]) ans=min(ans,get_e(i)+get_e(n-i));
}
printf("%d\n",ans);
}

[多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)的更多相关文章

  1. [多校联考2019(Round 4 T2)][51nod 1288]汽油补给(ST表+单调栈)

    [51nod 1288]汽油补给(ST表+单调栈) 题面 有(N+1)个城市,0是起点N是终点,开车从0 -> 1 - > 2...... -> N,车每走1个单位距离消耗1个单位的 ...

  2. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  3. [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

    [多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...

  4. [多校联考2019(Round 4 T1)][51nod 1295]Xor key(可持久化trie)

    [51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] ...

  5. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7

    此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...

  6. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  7. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  8. 【BZOJ5498】[十二省联考2019]皮配(动态规划)

    [BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...

  9. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

随机推荐

  1. springboot 在idea中实现热部署

    SpringBoot的web项目,在每一次修改了java文件或者是resource的时候,都必须去重启一下项目,这样的话浪费了很多的时间,实现了热部署,在每一次作了修改之后,都会自动的重启 第一步:引 ...

  2. mysql——非主键自增

    今天遇到一个问题: 要创建一张表,其中我想将ip和date这两列作为一个复合主键,可以通过如下语句修改表结构: alter table tb_name add primary key (字段1,字段2 ...

  3. .NET面试题系列(二十)XX

    遍历树.实现造成锁的代码.在线音乐网站 抽象工厂和工厂的区别 简单工厂 : 用来生产同一等级结构中的任意产品.(对于增加新的产品,无能为力) 工厂方法 :用来生产同一等级结构中的固定产品.(支持增加任 ...

  4. Python模块之-OS模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  5. [design pattern](6) Absract Factory

    前言 在前面的章节中,我们先后介绍了简单工厂模式和工厂方法模式.他们都是工厂模式大家族的一员,那么,本章将会接着上一章,来说一说工厂模式的最后一员,那就是抽象工厂模式. 思考题 首先,来思考下下面的问 ...

  6. eclipse代码自动补全设置

    1.说明 eclipse安装好了之后,在编辑框中输入某个英文字符,默认不自动弹出自动代码选择框,需要手动按下 Alt + / 或者输入的字符为 .  才弹出代码自动补全框.其实eclipse是可以设置 ...

  7. 如何下载如腾讯课堂等PC网页视频的方法

    其实网上的教程有很多,实际也没那么复杂. 一.用插件法 方法是用插件,大多数主流的浏览器都是支持插件的,只要下载个插件应用市场的视频插件就可以搞定了. 当然,每个浏览器的视频插件品牌都是不一样的.这里 ...

  8. SPFA算法的SLF优化 ——loj#10081. 「一本通 3.2 练习 7」道路和航线

    今天做到一道最短路的题,原题https://loj.ac/problem/10081 题目大意为给一张有n个顶点的图,点与点之间有m1条道路,m2条航线,道路是双向的,且权值非负,而航线是单向的,权值 ...

  9. @清晰掉 c语言三"巨头" const:volatile:static

    const: 1.如果把const放在变量类型前,说明这个变量的值是保持不变的(即为常量),改变量必须在定义时初始化,初始化后对她的任何赋值都是非法的. 2.当指针或是引用指向一个常量时,必须在类型名 ...

  10. Python 使用PyQt5进行开发(一)

    Qt  是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器. 我们先简单使用Qt进行一个小工 ...