三元环
三元环
-
问题描述,给定无向图,然后求出三元环个数
-
建图做法:先把无向图转化为 \(DAG\) ,把边去重,然后把度数从小的点连向度数大的点。
-
显然的是,每个三元环只能被找到一次。
-
时间复杂度证明:
可知边 \((x, y)\) 被遍历的次数是 \(out_y\),所以总复杂度是 \(m\times out_i\)
然后假设所有点 \(out_i< \sqrt m\),那么上界就是 \(m \times \sqrt m\)。
假设有点度数存在 \(out_i> \sqrt m\),因为是度数低的连向度数高的,所以至少有 \(\sqrt m\) 点连向 \(i\),并且度数也是 \(\sqrt m\),所以,其实度数最大只能是小于 \(\sqrt m\),不能大于 \(\sqrt m\)。
所以总的时间复杂度是 \(O(m \sqrt m)\) 的。
- 找环
for (int i = 1; i <= n; i ++) {
for (auto v:G[i]) vis[v] = i;
for (auto v:G[i]) {
for (auto vv : G[v]) {
if (vis[vv] == i)x++;
}
}
}