BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,CD,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王想知道最少可以分多少支队。
子图:V'为V的子集 E'为E的子集
诱导子图:对于V' 只要在G中有边 那么在G'中同样应该有边
最大独立集:最大的一个点的子集使任何两个点不相邻——最大独立集数
最大团:点数最多的团——团数
最小染色:用最少的颜色给点染色使相邻点颜色不同——色数
最小团覆盖:用最少个数的团覆盖所有的点——最小团覆盖数
结论: 团数<=色数 最大独立集数<=最小团覆盖数
弦(Chord):连接环中不相邻的两个点的边

弦图:一个无向图称为弦图,当图中任意长度大于3的环都至少有一个弦
弦图的每一个诱导子图一定是弦图
弦图的判断:
ZJU1015
给定一个无向图,判定它是否为弦图
单纯点:设N(v)为与点v相邻的点的点集 一个点是单纯点当且仅当{v}+N(v)的诱导子图为一个团
引理:任何一个弦图都至少有一个单纯点 不是完全图的弦图至少有两个不相邻的单纯点
完美消除序列:
一个点的序列(每个点出现且恰好出现一次)V1,V2....Vn满足Vi在{Vi,Vi+1,Vn}的诱导子图中为一个单纯点
定理:一个无向图是弦图当且仅当它有一个完美消除序列
MCS算法O(n+m):
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#define N 10000 + 10
#define M 2000000 + 10 using namespace std; struct edge
{
int to, next;
}e[M];
int n, m, num, ans, maxs;
int p[N], seq[N], col[N], lab[N], flag[N];
struct node
{
int now;
node *next;
}f[N];//链表
void add(int x, int y)
{
e[++num].to = y;
e[num].next = p[x];
p[x] = num;
}
void put(int x)
{
node *po = (struct node *)malloc(sizeof(struct node));
po->next = f[lab[x]].next;
po->now = x;
f[lab[x]].next = po;
}//链表的插入
void read(int &x)
{
x = ;
char c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '')
{
x = (x << ) + (x << ) + c - '';
c = getchar();
}
}
void init()
{
int x, y;
read(n), read(m);
for (int i = ; i <= m; ++i)
{
read(x), read(y);
if (x == y) continue;
add(x, y);
add(y, x);
}
}
void create()
{
for (int i = ; i <= n; ++i)
f[i].next = NULL;//
for (int i = ; i <= n; ++i) put(i);
maxs = ;//初始化
for (int i = n; i; i--)//用逆序求
{
node *po = f[maxs].next;//找到当前最大
while(flag[po->now])
{
f[maxs].next = po = po->next;//及时删除没有用的点(漏掉的话会超时)
while(po == NULL)
{
maxs--;
po = f[maxs].next;
}
}
f[maxs].next = po->next;//更新
while(f[maxs].next == NULL) maxs--;
int x = po->now;
flag[x] = , seq[i] = x;
for (int j = p[x]; j; j = e[j].next)
if (!flag[e[j].to])
{
++lab[e[j].to];//加势
if (lab[e[j].to] > maxs) maxs = lab[e[j].to];
put(e[j].to);
}
}
}
void paint()
{
for (int i = ; i <= n; ++i)
flag[i] = -;
for (int i = n; i; i--)
{
int x = seq[i];
for (int j = p[x]; j; j = e[j].next)
flag[col[e[j].to]] = i;
for (int j = ; j <= n; ++j)
if (flag[j] != i)
{
col[x] = j;
break;
}
if (ans < col[x]) ans = col[x];
}
}
void deal()
{
create();
paint();
printf("%d\n", ans);
}
int main()
{
//freopen("kingdom.in", "r", stdin);
//freopen("kingdom.out", "w", stdout);
init();
deal();
return ;
}
BZOJ 1006
BZOJ 1006 完美消除序列&最大势算法&弦图的更多相关文章
- bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法
[HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4370 Solved: 2041[Submit][Status][D ...
- 无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net
ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,v ...
- bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&&弦图的完美消除序列
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1788 Solved: 775[Submit][Stat ...
- BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)
题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...
- bzoj 4540 [HNOI 2016] 序列 - 莫队算法 - Sparse-Table - 单调栈
题目传送门 传送点I 传送点II 题目大意 给定一个长度为$n$的序列.询问区间$[l, r]$的所有不同的子序列的最小值的和. 这里的子序列是连续的.两个子序列不同当且仅当它们的左端点或右端点不同. ...
- ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net
●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...
- [BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】
题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小 ...
- 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题
1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...
- BZOJ 1006 [HNOI2008]神奇的国度==最大势算法
神奇的国度 K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在. ...
随机推荐
- 【并行计算-CUDA开发】#pragma unroll伪编译指令的使用
#pragma宏命令主要是改变编译器的编译行为,其他的参数网上资料比较多,我只想简单说下#pragma unroll的用法,因为网上的资料比较少,而且说的比较笼统,请看下面的一段代码 int main ...
- python urllib2 实现大文件下载
使用urllib2下载并分块copy: # from urllib2 import urlopen # Python 2 from urllib.request import urlopen # Py ...
- c++11特性
0. 简介 在c++11标准中, 语言本身和标准库都增加了很多新内容. 里面的某些特性, 会让你在代码编写时更优雅. 我的环境: 系统: ubuntu16.04 g++版本: g++5.4.0 使用c ...
- 切换PHP版本导致Phalcon拓展失效
公司使用PHP的Phalcon框架做后端.Phalcon最大的特点就是底层由C语言实现,使用Phalcon框架必须要安装php_phalcon.dll扩展.之前的是使用PHP7.2的版本,后面考虑性能 ...
- 作业2:java内存模型图示
参考:http://www.infoq.com/cn/minibooks/java_memory_model?utm_source=infoq&utm_campaign=user_page&a ...
- docker_nginx_php_mysql
https://blog.csdn.net/miwumuge/article/details/83386679 问题 1.容器内访问宿主机地址, host.docker.internal
- Java 中使用serversocket通信
1. 创建一个Java项目 TestMyServerSocket. 2. 创建一个包 com.weloglog.main 3. 创建一些使用到的类 程序启动类 MyServerSccket : 用来启 ...
- 解决windows系统下ping,ipconfig不是内部或外部命令
一般情况下,都是误删了系统变量path的值.解决方法:右击我的电脑 → 选择属性 → 选择高级系统设置 → 环境变量 → 在系统变量列表中,找到“path”环境变量双击,打开.在变量值这一栏检测下是否 ...
- (四)创建基于maven的javaFX+springboot项目,用户界面与后台逻辑分离方式
下面来介绍创建maven的javaFX+springboot项目,基于用户界面与后天逻辑分离的方式,用户界面使用fxml文件来常见,类似于jsp,可以引入css文件修饰界面 maven依赖 <d ...
- 如何解决windows 80端口被占用的情况
window下如果在安装某个软件或者启动tomcat时 会遇到80端口被占用的情况,通过命令 netstat -ano 查看端口被占用情况 找到占用80端口的进程ID,然后我们在任务管理器当中将这个进 ...