尽管如此,弦图依旧强大
一些定义#
最小染色:用最少的颜色给点染色使得所有边连接的两点颜色不同。
色数:最小染色的颜色数。
团数:最大团的点数。
弦:连接环中不相邻两点的边。
弦图:任意长度大于
点割集:对于图
单纯点:若点
完美消除序列:令
一些性质#
性质一#
团数
证明:
直接对最大团染不同颜色即可。
推论一#
在弦图中:团数
性质二#
最大独立集数
证明:
每个团中至多选择一个点。
推论二#
在弦图中:最大独立集数
性质三#
弦图的任意导出子图一定是弦图。
证明:
如果弦图有导出子图不是弦图,说明在这个导出子图上存在大于的无弦环,那么原图也不是弦图,矛盾。
性质四#
任何一个弦图都至少有一个单纯点,不是完全图的弦图至少有两个不相邻的单纯点。
性质五#
一个无向图是弦图当且仅当其有一个完美消除序列。
求法#
求出无向图的完美消除序列#
最大势算法(MCS)是一种可以在
思路#
逆序给结点编号,即按从
设
每次选择
时间复杂度:
Code#
inline void mcs() {
fro(i, 1, n) to[0].push_back(i);
int sum = 0;
pre(pos, n, 1) {
int x = 0, y;
while (!x) {
while (to[sum].empty() == 0 && !x) {
y = to[sum].back();
if (!rk[y] && lb[y] == sum) x = y;
to[sum].pop_back();
}
if(!x) sum--;
}
rk[x] = pos, id[pos] = x;
for (int i = head[x]; i; i = e[i].nxt)
lb[e[i].to]++, to[lb[e[i].to]].push_back(e[i].to), sum = max(sum, lb[e[i].to]);
}
}
此算法可以证明,若无向图为弦图,则求出的序列一定是完美消除序列。
同样,若求出的序列为完美消除序列,则无向图一定是弦图。
判断一个序列是否是完美消除序列#
根据完美消除序列的定义,设
则只需判断
时间复杂度
挑战 NPC#
各种不可做的图论问题在弦图上通通可以线性计算。
弦图实在是太厉害了。
求极大团#
令
则弦图的极大团只有可能为为
求最大团#
将所有的极大团取最大值即可。
也就是:
求色数#
由于色数
若需要方案。
可以在完美消除序列上从后往前染色,每个点染能染的最小颜色即可。
求最大独立集#
完美消除序列从前往后,选择所有没有与已经选择的点有直接连边的点。
求最小团覆盖#
设最大独立集为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)