小 C 是 \(n\) 个学生的老师,他现在要把所有学生分成两组,他会按照以下这些要求:

1、如果两个同学是好朋友那么他们就不会被分到同一组

2、小 C 想最小化两组人数差值

现在请你写一个程序来帮助小 C 分组,数据保证有合法的方案,如果有多种合法方案则输出字典序最小的

输入格式

第一行两个整数分别表示 \(n,m\)

接下来$ m$行,每行两个整数表示 \(x_i,y_i\)是好朋友

输出格式

如果第 \(i\) 位学生被分到第 1 组则第 \(i\) 位为 1,反之为 2

如果有多种合法方案则输出字典序最小的方案

数据范围

对于 \(30\%\) 的数据,\(2 \leq n \leq 16\)

对于 \(50\%\) 的数据,\(2 \leq n \leq 100\)

对于 \(100\%\) 的数据,\(2 \leq n \leq 1000,1 \leq m \leq 100000\)

输出时每行末尾的多余空格,不影响答案正确性

样例输入

6 4
1 2
1 3
4 6
4 5

样例输出

122211

如果把关系看成图论里的边,那么边相连的两个同学不能在一组,所以每一个连通块是一个二分图。就可以把一个连通块分成两部分学生,两部分学生一边是第一组,一边是第二组。

可以搜索考虑每一组的选择情况。把所有连通块按照最小编号的学生排完序后,为了让字典序尽量小,每个连通块优先让最小编号更小的那一部分选择1,其余选择2.过程中记录两组的差值。

发现搜索过程无后效性,记录\(dp_{i,j}\)为前i个连通块差值为\(j-N\)(防止负数)的情况是否枚举过。如果已经枚举过就不用再枚举一次了。复杂度O(n^2)

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,m,hd[N],t[N],idx=1,ans[N],v[N<<1][N<<1],k,ret=2e9,st[N],x,y;
struct edge{
int v,nxt;
}e[N<<8];
void add_edge(int u,int v,int z)
{
e[z]=(edge){v,hd[u]};
hd[u]=z;
}
vector<int>g[N+N];
void dfs(int x,int y)
{
t[x]=y,g[y].push_back(x);
for(int i=hd[x];i;i=e[i].nxt)
if(!t[e[i].v])
dfs(e[i].v,y^1);
}
void sou(int x,int y)
{
if(v[x][y+1000])
return;
if(x>idx)
{
if(abs(y)<ret)
memcpy(ans,st,sizeof(st)),ret=abs(y);
return;
}
v[x][y+1000]=1;
for(int i=0;i<g[x].size();i++)
st[g[x][i]]=1;
for(int i=0;i<g[x|1].size();i++)
st[g[x|1][i]]=2;
sou(x+2,y+g[x].size()-g[x|1].size());
for(int i=0;i<g[x].size();i++)
st[g[x][i]]=2;
for(int i=0;i<g[x|1].size();i++)
st[g[x|1][i]]=1;
sou(x+2,y+g[x|1].size()-g[x].size());
}
int main()
{
scanf("%d%d",&n,&m),k=n+n+1;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add_edge(y,x,i<<1);
add_edge(x,y,i<<1|1);
}
for(int i=1;i<=n;i++)
{
if(!t[i])
{
dfs(i,++idx);
++idx;
}
}
sou(2,0);
for(int i=1;i<=n;i++)
printf("%d",ans[i]);
}

[计蒜客20191103C] 分组的更多相关文章

  1. 计蒜客 作弊揭发者(string的应用)

    鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...

  2. 计蒜客的一道题dfs

    这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...

  3. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  4. 计蒜客 等边三角形 dfs

    题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...

  5. 计蒜客 方程的解数 dfs

    题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...

  6. 计蒜客 买书 dfs

    题目: https://www.jisuanke.com/course/2291/182236 思路: 递归解决,从第一本书开始,每本书都有两种选择: //index是book里面每本书价格的下标, ...

  7. 计蒜客:Entertainment Box

    Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...

  8. 爬虫acm比赛成绩(多页成绩整合在一起、获取复制不了的数据)(hihocoder、计蒜客)

    https://github.com/congmingyige/web-crawler_rank-of-competition-in-JiSuanKe-and-hihocoder 1. 计蒜客(获取复 ...

  9. 计蒜客 31436 - 提高水平 - [状压DP]

    题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...

  10. 计蒜客 31434 - 广场车神 - [DP+前缀和]

    题目链接:https://nanti.jisuanke.com/t/31434 小 D 是一位著名的车手,他热衷于在广场上飙车.每年儿童节过后,小 D 都会在广场上举行一场别样的车技大赛. 小 D 所 ...

随机推荐

  1. 将实体类对象数据存入和读取进csv文件(可追加)

    前言 最近公司一个新的项目,因为需要存储的数据很少,单独去部署一个数据库去存储该数据显然是不划算的,所以想的是通过存入csv文件中来代替存入数据库中.说干就干. 什么是csv文件 CSV代表逗号分隔值 ...

  2. 聊聊HuggingFace如何处理大模型下海量数据集

    翻译自: Big data? Datasets to the rescue! 如今,使用大GB的数据集并不罕见,特别是从头开始预训练像BERT或GPT-2这样的Tranformer模型.在这样的情况下 ...

  3. QA|Pycharm:allure : 无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。|Allure

    Pycharm中生成allure测试报告时报错如图: 单独执行allure --version也不行,cmd这样执行也报同样的错 网上查了 说是环境变量问题,加一下cmd可以了,重启pycharm也可 ...

  4. Java程序员学vue3最好的方式就是搭建后台管理模板

    前言 作为Java程序员,vue3还是有必要学的,毕竟是国内最受欢迎的前端JS框架,你现在接手的项目,前端部分几乎都会和vue沾边,尤其是中小企业. vue3作为新的大版本,相较于vue2改动还是很多 ...

  5. 从软件工程师角度聊聊 Kubernetes

    作为软件工程师,我们应该熟悉 K8s,尽管它有点像 DevOps,但它能让我们更好地了解幕后发生的事情,让我们与部署工作更密切相关,更有责任感.本文将从软件工程师的角度探讨 Kubernetes (K ...

  6. Mac SpringBoot项目 Gradle 7.3 转 Maven 手把手教学,包学会~

    导读 最近我手上有个使用Gradle构建的项目,国内使用Gradle的人相对较少.而且我也觉得Gradle的依赖管理方式有些复杂,让我感到有些困惑.因此,我想将项目转换为Maven构建方式.Maven ...

  7. Solution -「洛谷 P3773」「CTSC 2017」吉夫特

    Description Link. 求满足 \[\prod _{i=2}^{k} \binom{a_{b_{i-1}}}{a_{b_i}} \mod 2 = \binom{a_{b_1}}{a_{b_ ...

  8. Note -「普通生成函数 OGF」

    \(\mathbf{OGF}\) 的定义 对于一个序列 \(a_{1},a_{2},\cdots\),我们称: \[G(x)=\sum_{i=0}^{\infty}a_{i}x^{i} \] 为序列 ...

  9. 算法打卡|Day1 数组part01

    Day1 数组part01 今日任务:数组理论基础,704. 二分查找,27. 移除元素 目录 Day1 数组part01 今日任务:数组理论基础,704. 二分查找,27. 移除元素 Part1: ...

  10. 前端三件套系例之JS——JavaScript基础、JavaScript基本数据类型、JavaScript函数

    文章目录 1 JavaScript基础 1.JavaScript是什么 2.JavaScript介绍 2-1 ECMAScript和JavaScript的关系 2-2 ECMAScript的历史 3. ...