整天鬼畜题搞搞,感觉药丸……

这种题出到xjoi模拟题里,太神了……

这题的核心在于分割Cograph,尝试把Cograph的合成过程给求出来。

我们将这张图中的边定为黑边,在这张图的补图中出现的边定为白边,则黑边和白边构成了一个完全图。

1.如果当前这张图的黑边是不联通的,那么可以检查所有的黑边构成的联通块是不是Cograph,如果都是Cograph,则原图也为Cograph

2.如果当前这张图的白边是不联通的,那么可以检查所有的白边构成的联通块是不是Cograph,如果都是Cograph,则原图也为Cograph

3.如果当前这张图中的白边黑边都是联通的,直接返回该图不是Cograph

这样做显然是正确的,但是时间复杂度太高了,每次划分的复杂度是\(O(m)\)的,由于白边有\(O(n^2)\)条,因此这个做法也是\(O(n^2)\)

显然是会爆炸的……

考虑优化这个做法,我们并不需要枚举所有白边,当找到一条白边时,就将它所连接的两个白联通块合并,合并次数是\(O(n)\)的

因此需要一种支持快速 合并联通块、查询一个联通块到另一个联通块之间所有边的数据结构……

这里用链表维护联通块……(为什么不用并查集?因为我要访问该联通块所有的点

这样就可以保证每次查询的边一定是不在当前同一个联通块中,

查询的两个点间要么是黑边要么是白边,黑边只有\(O(m)\)条,由于只有\(O(n)\)次合并,因此扫到的白边只有\(O(n)\)条,时间复杂度是\(O(n + m)\)的

这样对于一个问题,只需要\(O(n + m)\)就可以把它变成若干个小原问题了。

由于Cograph每层的分割至少有\(O(n)\)条连接在白联通块之间的黑边被删除了,因此这样分割的层数是\(O(min(m / n, n))\)的

总时间复杂度\(O((n + m)\sqrt{m})\)

跑的稍微有点慢啊~

#include <bits/stdc++.h>
#define N 300000
using namespace std;vector <int> bi[N], bn[N];
int T, n, m;
int ai[N];
int nx[N], ne[N], nl[N], tot;
int vis[N], td[N], tt[N], col[N];
int tmp;
void dfs1(int t, int c)
{vis[t] = c;for (int i = 0; i < bi[t].size(); ++ i)if (!vis[bi[t][i]]) dfs1(bi[t][i], c);
}
int solve2(int t);
int solve1(int t)
{int nw = tmp + 1;for (int p = t; p; p = nx[p]) vis[p] = 0;for (int p = t; p; p = nx[p])if (!vis[p])dfs1(p, vis[p] = ++ tmp);for (int p = t; p; p = nx[p]){if (!tt[vis[p]]) tt[vis[p]] = td[vis[p]] = p;else{nx[td[vis[p]]] = p;td[vis[p]] = p;}}for (int i = nw; i <= tmp; ++ i){nx[td[i]] = 0;if (!solve2(tt[i])) return 0;}return 1;
}
set <int> S[N];
int test(int a, int b)
{return S[a].count(b);
}
int solve2(int t)
{if (nx[t] == 0) return 1;for (int p = t; p; p = nx[p]) ne[p] = nx[p], nl[p] = p;for (int p = t; p; p = ne[p]) nx[p] = 0;for (int p = t; p; p = ne[p]){for (int a = p; a; a = nx[a]){for (int q = ne[p], c = p; q; ){int bo = 0;for (int b = q; b; b = nx[b])if (!test(a, b)){bo = 1;goto haha;}haha:if (bo){nx[nl[p]] = q;nl[p] = nl[q];nl[q] = 0;ne[c] = ne[q];ne[q] = 0;q = ne[c];}else{c = ne[c];q = ne[q];}}}}if (ne[t] == 0) return 0;for (int p = t; p; p = ne[p])for (int q = p; q; q = nx[q])col[q] = p, bn[q].clear();for (int p = t; p; p = ne[p])for (int q = p; q; q = nx[q])for (int a = 0; a < bi[q].size(); ++ a)if (col[bi[q][a]] == col[q]) bn[q].push_back(bi[q][a]);for (int p = t; p; p = ne[p])for (int q = p; q; q = nx[q])bi[q] = bn[q];vector <int> nls;for (int p = t; p; p = ne[p]) nls.push_back(p);for (int p = 0; p < nls.size(); ++ p)if (!solve1(nls[p])) return 0;return 1;
}
int main()
{//freopen("C.in", "r", stdin);scanf("%d", &T);while (T --){scanf("%d%d", &n, &m);for (int i = 1; i <= m; ++ i){int a, b;scanf("%d%d", &a, &b);bi[a].push_back(b); S[a].insert(b);bi[b].push_back(a); S[b].insert(a);}for (int i = 1; i < n; ++ i) nx[i] = i + 1, ne[i] = 0;nx[n] = 0;if (solve1(1)) puts("TAK"); else puts("NIE");for (int i = 1; i <= n; ++ i) bi[i].clear(), S[i].clear();}
}

转载于:https://www.cnblogs.com/AwD-/p/6266351.html

bzoj 2075: [POI2004]KAG相关推荐

  1. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  2. Bzoj 2073 [POI2004]PRZ

    2073: [POI2004]PRZ Time Limit: 10 Sec  Memory Limit: 64 MB Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们 ...

  3. bzoj 2073: [POI2004]PRZ

    2073: [POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的 ...

  4. BZOJ 2073: [POI2004]PRZ 状压动归

    2073: [POI2004]PRZ Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 315  Solved: 237 [Submit][Status] ...

  5. BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)

    题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...

  6. bzoj 2096 [POI2004]ZAW——二进制枚举

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成  从1点出的一部分  和  走向1点的一部分.多起点最短路就和 ...

  7. BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)

    题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...

  8. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图,每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们需要从点1出发走到某个和点1相邻的点上,然后沿最短路走到另一个和点1相邻 ...

  9. 【刷题】BZOJ 2069 [POI2004]ZAW

    Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...

最新文章

  1. cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
  2. 可租赁、可定制的虚拟人居然还能这么玩?9月25日来百度大脑人像特效专场一探究竟!...
  3. RocketMQ实战(四)
  4. OpenCV图像处理——深度学习样本制造
  5. 初学python之路-day20
  6. IntelliJ IDEA for Mac在MacOS模式下的编辑快捷键(Editing Shortcut)
  7. android手机解除root,手机显示被root什么意思(手机root怎么解除)
  8. linux每个版本发布时间,Ubuntu 21.04各版本的发布时间公布和计划功能介绍
  9. 一道简单的sql语句题
  10. 三维球体换算到二维_三维制图讲义04 - 基础几何体
  11. Python基础_列表与元组
  12. 拓端tecdat|matlab递归神经网络RNN实现:桨距控制控制风力发电机组研究
  13. PyTorch载入图片ToTensor,PIL和OpenCV读取图片plt.imread和PIL.Image.open
  14. Java 接口和抽象类的异同点
  15. distribute-list分发列表 转自 红茶三杯sina blog
  16. 摘录 | 《记一忘三二》
  17. 创建脚手架时,查看vue版本
  18. linux-centos8安装nginx
  19. Debain 安装图形化界面 GNome
  20. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):MPG:一种有效的自我监督框架,用于学习药物分子的全局表示以进行药物发现

热门文章

  1. Windows 10快速删除大量回收站文件以及由此引起的回收站右键清空反应慢问题的解决
  2. CanMV K210 AI开发板全网首发,项目代码完全开源,千套开发板限时优惠!
  3. springboot中druid数据源配置无效的问题和jar包找不到问题
  4. 计算机病毒装逼桌面,3个Win10神秘装逼小技巧
  5. Deepin 使用教程:前言
  6. HLG 火影忍者之~静音
  7. 第3章 内核编程语言与环境(2)
  8. 生命是一个苦旅,我们都在路上
  9. 曙光服务器显示器接入只显示logo,显示屏只显示显示屏品牌logo,没有其他反应
  10. BP神经网络推导(两个隐藏层)