三元环计数四元环计数

三元环计数

问题

给出一张n个点m条边的无向图,问图中有多少个三元组{ u , v , w } ,满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边。

求解

Step1 定向

将所有点按 度数 从小到大排序,如果度数相同按 点编号 从小到大排序,u的排名记作 rnkurnk_urnku

将这张图转化为有向图:对于一条无向边 x − y ,若 rnkx>rnkyrnk_x>rnk_yrnkx>rnky,那么就将这条无向边变成 x → y 。反之则反之。

这样转化后,这张图一定是 有向无环图

证明:

使用反证法,假设有一个环:a→b→c→aa\to b \to c \to aabca
那么有(设 x 的度数为 dxd_xdx):
da≥db≥dc≥dad_a \geq d_b \geq d_c \geq d_adadbdcda,要使该不等式成立,当且仅当满足 da=db=dc=dad_a = d_b = d_c = d_ada=db=dc=da

设 x 的编号为 idxid_xidx,那么有:ida>idb>idc>idaid_a>id_b>id_c>id_aida>idb>idc>ida,即 ida>ida>ida>idaid_a > id_a > id_a > id_aida>ida>ida>ida,该式子不成立,故假设不成立,证毕。

Step2 暴力枚举

枚举一个点 u 和它的所有出边到的点 v 并标记,再枚举 v 的出边到的点 w,如果 w 也有标记则表示找到了一个三元环

这样,每个三元环只会在 u 被统计一次(rnkurnk_urnku在三元环中是最大的)

Code

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+5;
const int M=2e5+5;
struct Edge{int v,nxt;
}edge[M<<1];
int n,m,head[N],cnt,a[M],b[M];
int d[N],ans,mark[N];
void add_edge(int u,int v){edge[++cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt;
} 
bool cmp(int a,int b){if(d[a]==d[b]) return a>b;return d[a]>d[b];
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);d[a[i]]++;d[b[i]]++;}for(int i=1;i<=m;i++){if(d[a[i]]>d[b[i]]||(d[a[i]]==d[b[i]]&&a[i]>b[i]))add_edge(a[i],b[i]);else add_edge(b[i],a[i]);}for(int u=1;u<=n;u++){for(int i=head[u];i;i=edge[i].nxt) mark[edge[i].v]=u;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;for(int j=head[v];j;j=edge[j].nxt){int w=edge[j].v;if(mark[w]==u) ans++;}}}printf("%d\n",ans);return 0;
} 

时间复杂度

考虑每一条边被遍历的次数:对于一条边 x→yx\to yxy,他被遍历的次数为 inxin_xinx 。(inxin_xinx表示 x 的入度),那么总的时间复杂度就是每一条边的 inxin_xinx 之和。

又可以发现,inxin_xinx 的上限就是 m\sqrt mm,因为要求每个连向 x 的点的度都大于 inxin_xinx ,也就是说,有 inxin_xinx 个点的度数大于inxin_xinx,这样就至少需要 inx2in_x^2inx2 条边,所以 inx2≤m⇒inx≤min_x^2\leq m ⇒ in_x \leq \sqrt minx2minxm

所以总时间复杂度 O(mm)O(m\sqrt m)O(mm)

四元环计数

问题

给出一张n个点m条边的无向图,问图中有多少个四元组{ u , v , w ,x } ,满足图中存在 { (u,v) , (v,w) , (w,x),(x,u) } 四条边。

求解

Step1 定向

同三元组计数

Step2 暴力枚举

枚举一个点 u 和它的所有 出边 到的点 v ,然后枚举 v 的 无向边 到的点 w,其中要求 rnku>rnkwrnk_u>rnk_wrnku>rnkw

每访问到一个 w 给答案加上 w 的标记,并给 w 的标记加 1

这样,每个四元环只会在 u 被统计一次(rnkurnk_urnku在四元环中是最大的)

Code

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e5+5;
const int M=2e5+5;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct Edge{int v,nxt;
}edge[M<<1],e[M<<1];
int n,m,head[N],cnt,hd[N],ct,a[M],b[M];
int d[N],mark[N],tmp[N];
long long ans;
void add_edge(int u,int v){edge[++cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt;
} 
void add_e(int u,int v){e[++ct].v=v;e[ct].nxt=hd[u];hd[u]=ct;
}
bool cmp(int a,int b){if(d[a]==d[b]) return a>b;return d[a]>d[b];
}
int main(){n=read();m=read();for(register int i=1;i<=m;i++){a[i]=read();b[i]=read();d[a[i]]++;d[b[i]]++;add_e(a[i],b[i]);add_e(b[i],a[i]);}for(register int i=1;i<=m;i++){if(d[a[i]]>d[b[i]]||(d[a[i]]==d[b[i]]&&a[i]>b[i]))add_edge(a[i],b[i]);elseadd_edge(b[i],a[i]);}ans=0;for(register int u=1;u<=n;u++){for(register int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;for(register int j=hd[v];j;j=e[j].nxt){int w=e[j].v;if(d[u]>d[w]||(d[u]==d[w]&&u>w)){ans+=1ll*tmp[w];tmp[w]++;}}}for(register int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;for(register int j=hd[v];j;j=e[j].nxt){int w=e[j].v;if(d[u]>d[w]||(d[u]==d[w]&&u>w)) tmp[w]=0;}}}printf("%lld\n",ans);return 0;
}

时间复杂度

O(mm)O(m\sqrt m)O(mm)

证明(自己想的,不保证对):

对于边x−yx - yxy,假设它定向后为 x→yx \to yxy
那么作为无向边它被遍历 inx+inyin_x+in_yinx+iny 次,作为有向边被遍历 inxin_xinx 次,总过被遍历 2inx+iny2in_x+in_y2inx+iny

总复杂度仍是 O(mm)O(m\sqrt m)O(mm)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 a180285非常喜欢滑雪。他来到一座雪山&#xff0c;这里分布着M条供滑行的轨道和N个轨道之间的交点&#x…

漫谈单体架构与微服务架构(上):单体架构

最近微服务架构特别火爆&#xff0c;就跟人工智能、区块链一样&#xff0c;软件架构设计如果不提微服务&#xff0c;感觉就像是与世界先进的架构风格和开发技术脱了节似的&#xff0c;各方各面都无法彰显高大上的气质。本来再打算使用一套系列文章来讨论微服务的方方面面&#…

ASP.NET Core应用程序的参数配置及使用

应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务&#xff0c;此时你就需要有一个合理的应用程序配置方案&#xff0c;以便在开发和生产环境中能够方便地选用不同的配置参数&#xff0c;并且能够在部署到容器服务&#xff08;比如ACS或者Kub…

“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

比赛链接 文章目录A题 A Simple Problem about election题目描述题解&#xff1a;代码&#xff1a;D题 Deploy the medical team题意&#xff1a;题解&#xff1a;代码&#xff1a;F题 Figure out the sequence题意&#xff1a;题解&#xff1a;代码A题 A Simple Problem about…

RabbitMQ一个简单可靠的方案(.Net Core实现)

前言最近需要使用到消息队列相关技术&#xff0c;于是重新接触RabbitMQ。其中遇到了不少可靠性方面的问题&#xff0c;归纳了一下&#xff0c;大概有以下几种&#xff1a;1. 临时异常&#xff0c;如数据库网络闪断、http请求临时失效等&#xff1b;2. 时序异常&#xff0c;如A任…

牛牛染颜色

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;核心代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 牛牛最近得到了一颗树&#xff0…

.netcore consul实现服务注册与发现-单节点部署

一、Consul的基础介绍Consul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;比如 Airbnb的SmartStack等相比&#xff0c;Consul的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一…

分布式事务解决方案以及 .Net Core 下的实现(上)

数据一致性是构建业务系统需要考虑的重要问题 &#xff0c; 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。最近在研究分布式事物&#xff0c;分布式的解决方案有很多解决方案&#xff0c;也让我在研究的同…

微软MVP张善友告诉你,微服务选型要注意这些地方

周六的下午&#xff0c;广州周大福金融中心的写字楼静悄悄的&#xff0c;53楼的实盈多功能会议室却异常火爆&#xff0c;热闹非凡。来自广州各大科技公司的技术小伙伴们齐聚一堂&#xff0c;他们都在期待着一个人&#xff0c;那就是——微软MVP张善友和他带来的 .NET Core 微服…

像鱼

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给你一个边长为 n 的用硬币摆成的实心三角形&#xff0c;请问把他倒过来最少需要多少步&#xff1f; 例子…

[ZJOI2005]午餐(贪心+dp)

首先若只有一个窗口&#xff0c;利用贪心&#xff0c;按吃饭时间从大到小排序即可 正确性证明&#xff1a; 定义 eat[i] 第i个人的吃饭时间&#xff0c;time[i] 第i个人的打饭时间 延长时间T[i]max(eat[i]- ∑ji1ntimej\sum\limits_{ji1}^ntime_jji1∑n​timej​ ,0) 最后…

【图论】【模板】静态仙人掌(luogu 5236)

【模板】静态仙人掌 题目大意 给你一个无向仙人掌图&#xff08;保证每条边至多出现在一个简单回路中的无向图&#xff09;&#xff0c;问你两个点之间的最短路距离 输入样例#1 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1 1 9 5 7输出样例#1 5 …

SCF: 简单配置门面

Simple Configuration Facade, 简写为 SCF。是 代码 和 外部配置 (properties文件, 环境变量&#xff0c;系统/命令行参数, yaml文件, 等等)之间的一层抽象. 命名上和另一个著名组件slf4j (Simple Logging Facade for Java)相似, 在配置领域的地位也和slf4j &#xff08;.NET可…

【矩阵乘法】【倍增】美食家(luogu 6772)

美食家 题目大意 给你一个有向图&#xff0c;边权为经过所需时间 每个点有一个点权&#xff0c;有些点还有有特殊的点权 当你到达一个点后&#xff0c;可以获得该点的点权&#xff08;重复经过可以重复获得&#xff0c;但不能停留&#xff09;&#xff0c;若在某个时间到某个…

.net core实践系列之短信服务-为什么选择.net core(开篇)

前言从今天我将会写.net core实战系列&#xff0c;以我最近完成的短信服务作为例子。该系列将会尽量以最短的时间全部发布出来。源码也将优先开源出来给大家。源码地址&#xff1a;https://github.com/SkyChenSky/Sikiro.SMS.NET CORE简介ASP.NET Core 是一个跨平台的高性能开源…

.netcore consul实现服务注册与发现-集群完整版

一、Consul的集群介绍Consul Agent有两种运行模式&#xff1a;Server和Client。这里的Server和Client只是Consul集群层面的区分&#xff0c;与搭建在Cluster之上的应用服务无关&#xff0c; 以Server模式运行的Consul Agent节点用于维护Consul集群的状态&#xff0c;官方建议每…

浅谈surging服务引擎中的rabbitmq组件和容器化部署

1、前言上个星期完成了surging 的0.9.0.1 更新工作&#xff0c;此版本通过nuget下载引擎组件&#xff0c;下载后&#xff0c;无需通过代码build集成&#xff0c;引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎&#xff0c;而这篇将介绍浅谈surging服务引擎中的rabbi…

csp-j/s总结

文章目录csp-jcsp-s总结csp-j T1傻逼题(我是傻逼&#xff09;&#xff0c;手残把&打成整除了&#xff08;大样例还对了gg&#xff09; T2乱推&#xff0c;然后打了个O(n)O(n)O(n)&#xff0c;却WA了15分&#xff1f; T3看了看&#xff0c;修改不会相互影响&#xff1f;那不…

.net core实践系列之短信服务-架构设计

前言上篇《.net core实践系列之短信服务-为什么选择.net core&#xff08;开篇&#xff09;》简单的介绍了&#xff08;水了一篇&#xff09;.net core。这次针对短信服务的架构设计和技术栈的简析。源码地址&#xff1a;https://github.com/SkyChenSky/Sikiro.SMS为什么需要架…

CAP 2.3版本发布,支持 MongoDB

前言经过2个月的调整及测试&#xff0c;CAP 2.3 版本终于发布了&#xff0c;这个版本最大的特性就是对于 MongoDB 的支持&#xff0c;感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR&#xff0c;相信随着博客园的使用&#xff0c;CAP 会越来越多的帮助到更多的人。CAP …