题目大意

K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则。他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的。为了巩固三角关系,K 国禁止四边关系,五边关系等等的存在。所谓 N 边关系,是指 N 个人 A1 A2 ... An 之间仅存在 N 对认识关系:(A1 A2) (A2 A3) ... (An A1),而没有其它认识关系,比如四边关系指 A B C D 四个人 AB,BC,CD,DA 相互认识,而 AC,BD 不认识。全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,最少可以分多少支队。

Input

  第一行两个整数 N,M。1<=N<=10000,1<=M<=1000000。表示有 N 个人,M 对认识关系.。接下来 M 行每行输入一对朋友

Output

  输出一个整数,最少可以分多少队

做法分析

根据提题意,不难看出,所有的人构成的关系图是一个弦图(长度超过 3 的环中必有一条弦),求出它的完美性消除序列,根据完美消除序列逆序贪心的染色,最终所用的色数就是本题的答案

完美消除序列的求法:

使用陈丹琦讲述的 MCS 法,可以在 o(n+m) 的时间复杂度中求出一个图的完美消除序列,并在 o(n+m) 的时间复杂度下判断这个完美消除序列是否合法,不过,我不知道怎么在 o(n+m) 的时间复杂度下求出这个完美消除序列,或许是利用桶优化吧,我写了个堆优化的,时间复杂度也能接受

求完美消除序列的 MCS 法是倒着解的,也就是先求序列的第 n 个再求序列的第 n-1 个

每次选取图中具有最大标号的点作为完美消除序列中对应位置的点,并用这个点更新所有和他邻接的不再序列中的点的标号值

对于一个弦图的染色,用完美消除序列可以很好的解决,按照完美消除序列中的点倒着给图中的点贪心的然尽可能小的颜色

最终,一定能够用最小的颜色数量给图中的所有点染色

本题可以先求出来这个弦图的完美消除序列,由于一定是一个弦图,所以序列一定合法,直接根据消除序列染色就行

更多的和弦图区间图相关的知识,请看陈丹琦的PPT:弦图与区间图

参考代码

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue> using namespace std; const int N=; vector <int> arc[N];
int n, m, R[N], SA[N], label[N]; priority_queue <pair<int, int> > heap;
void Construct() {
fill(R+, R++n, -);
fill(label+, label++n, );
for(int i=; i<=n; i++) heap.push(make_pair(, i));
for(int cnt=n; cnt>=; ) {
int id=heap.top().second;
heap.pop();
if(R[id]!=-) continue;
SA[cnt]=id, R[id]=cnt--;
for(int i=, len=(int)arc[id].size(); i<len; i++) {
int u=arc[id][i];
if(R[u]!=-) continue;
label[u]++;
heap.push(make_pair(label[u], u));
}
}
} void Color(int u) {
for(int i=, len=(int)arc[u].size(); i<len; i++) {
int v=arc[u][i];
if(label[v]==-) continue;
R[label[v]]=u;
}
for(int i=; label[u]==-; i++) if(R[i]!=u) label[u]=i;
} int Color_Graph() {
fill(label+, label++n, -);
fill(R+, R++n, -);
for(int i=n; i>; i--) Color(SA[i]);
int ans=;
for(int i=; i<=n; i++) ans=max(ans, label[i]);
return ans;
} int main() {
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++) arc[i].clear();
for(int i=, a, b; i<m; i++) {
scanf("%d%d", &a, &b);
arc[a].push_back(b);
arc[b].push_back(a);
}
Construct();
printf("%d\n", Color_Graph());
return ;
}

BZOJ 1006

题目链接 & AC 通道

BZOJ 1006 [HNOI2008] 神奇的国度

BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)的更多相关文章

  1. [BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】

    题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小 ...

  2. BZOJ 1006: [HNOI2008]神奇的国度(弦图染色)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1006 题意: 思路: 这个就是弦图染色问题,弦图啥的反正我也不懂,具体看论文https://wenk ...

  3. bzoj 1006: [HNOI2008]神奇的国度【弦图+LesBFS】

    参考论文:https://wenku.baidu.com/view/6f9f2223dd36a32d73758126.html 参考代码:http://hzwer.com/3500.html 虽然会写 ...

  4. bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Stat ...

  5. BZOJ 1006: [HNOI2008]神奇的国度( MCS )

    弦图最小染色...先用MCS求出完美消除序列然后再暴力染色... ------------------------------------------------------------------- ...

  6. bzoj 1006: [HNOI2008]神奇的国度 -- 弦图(最大势算法)

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MB Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角 ...

  7. bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法

    [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4370  Solved: 2041[Submit][Status][D ...

  8. ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net

    ●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...

  9. BZOJ 1006 [HNOI2008]神奇的国度==最大势算法

    神奇的国度 K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在. ...

随机推荐

  1. [C++] 几行代码生成漂亮图片,数学家就是牛!

    信息获得处:http://news.cnblogs.com/n/501488/ 分形:http://baike.baidu.com/subview/83243/11213590.htm?fr=alad ...

  2. We are doomed, and RPC does not help

    第一种死法:Big ball of Mud 架构里最常用的反面案例是 big ball of mud.很大程度上可以说打格子,把复杂的系统拆解成小格子是架构师最重要的工作.这个小格子有很多种名字,比如 ...

  3. Gradle命令行黑魔法

    毫无疑问,现在Gradle已经成为java世界最火的构建工具,风头已经盖过了冗余的ant,落后的maven.Gradle是以Groovy语言编写的一套构建脚本的DSL,由于Groovy语法的优雅,所以 ...

  4. TF Boys (TensorFlow Boys ) 养成记(三)

    上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...

  5. 电影成生活O2O必争之地,破局之战就此拉开

    这一次的两会过后,互联网最流行的一个词恐怕当属“互联网+”.尤其是总理关于“以互联网为载体.把线上线下互动的新兴消费搞得红红火火”的一席话,更是让国内的O2O从业者兴奋不已.百度李彦宏在两会接受记者采 ...

  6. Android模拟器配置

    // 检查连接设备,为了保证运行正常,只能留一个连接设备 adb devices

  7. Spark安装指南

      一.Windows环境安装Spark 1.安装Java环境:jdk-8u101-windows-x64 配置环境变量: (1)增加变量名:JAVA_HOME 变量值:C:\Program File ...

  8. 利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程

    参考资料 reference:  http://mongodb.blog.51cto.com/1071559/740131  http://docs.mongodb.org/manual/tutori ...

  9. Visual Studio 2013 无法正常打开项目文件

    提示:无法打开 vcxproj 因为此版本的应用程序不支持其项目类型 ,若要打开它 请使用支持此类型项目的版本. 检查  AppData\Roaming\Microsoft\VisualStudio\ ...

  10. [转]office2010一直卡在“正在受保护的视图中打开”

    用Office 2010 打开文件遇到“”,如下图: 转自: 解决办法: 还可以使用下面的方法打开上图的受保护视图设置界面:   1. 启动 Word 2010 应用程序,单击[文件]按钮并选择[选项 ...