博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三元环、四元环计数
阅读量:4841 次
发布时间:2019-06-11

本文共 1300 字,大约阅读时间需要 4 分钟。

这东西其实就是一种暴力,只不过巧妙的是每一个环恰好统计了一次。

三元环计数推荐一篇博客,,很详细,很清楚。
每一个三元环之所以被算了一次,是因为一个三元环在新图上必定只有一个点的出度为2,然后我们只在这个点上更新三元环数量。
然后我放了个代码:

#define forE(i, x, y) for(int i = head[x], y; (y = e[i].to) && ~i; i = e[i].nxt)In bool dcmp(int x, int y) {return d[x] == d[y] ? x > y : d[x] > d[y];}In void calc_3(){    for(int x = 1; x <= n; ++x)    {        forE(i, x, y) if(dcmp(x, y)) ++cnt[y];        forE(i, x, y) if(dcmp(x, y))            forE(j, y, z) if(dcmp(y, z) && cnt[z]) ++cir3[x], ++cir3[y], ++cir3[z];        forE(i, x, y) if(dcmp(x, y)) cnt[y] = 0;    }}

四元环计数网上好想找不到,抄了神仙的代码自己脑补了一下。
还是将图按上述规则转化成有向无环图,然后对于每一个点\(x\),遍历他在新图上的出边,即走到的点为\(y\),再遍历\(y\)原图\(y\)相邻的点\(z\),然后用上面代码的dcmp函数判断\(x, z\),如果成立,说明找到了四元环的一半,那么用\(z\)上已经记录的“半个”四元环个数更新\(x, y, z\),然后在\(z\)上记录这又多了一个“半个”四元环。
但这样会导致先找到的“半个”四元环没有和后面的“半个”四元环匹配上,因此我们还要按上述方法再遍历一遍\(x, y, z\),同时更新每一个节点上的四元环数量。
按这种方法遍历一定会保证每一个四元环只被算过一次,但证明我还是没太想明白。

In void calc_4(){    for(int x = 1; x <= n; ++x)    {        forE(i, x, y) if(dcmp(x, y))            forE(j, y, z) if(dcmp(x, z))            {                int& v = cnt[z];                cir4[x] += v, cir4[y] += v, cir4[z] += v;                ++v;            }        forE(i, x, y) if(dcmp(x, y))            forE(j, y, z) if(dcmp(x, z)) cir4[y] += (--cnt[z]);    }}

转载于:https://www.cnblogs.com/mrclr/p/11054016.html

你可能感兴趣的文章
shell编程
查看>>
2018上IEC计算机高级语言(C)作业 第1次作业
查看>>
hdu 1753
查看>>
return ;
查看>>
td在relative模式下,IE9不显示border
查看>>
7-内置数据结构
查看>>
version control(版本控制)
查看>>
FutureTask
查看>>
JDBC的元数据
查看>>
Intel CPU参数查询网站
查看>>
JQuery - Ajax和Tomcat跨域请求问题解决方法!
查看>>
spring跨重定向传递数据
查看>>
10693 PKKJ的生日礼物
查看>>
把Nehe 纹理教程06,用freeImage改写
查看>>
python 中is和= = 的区别
查看>>
[C/C++]关于C++11中的std::move和std::forward
查看>>
图片显示、PNG透明
查看>>
Java的sql动态参数
查看>>
centos 6.5 双网卡 上网 virtualbox nat hostonly
查看>>
11大Java开源中文分词器的使用方法和分词效果对比
查看>>