Luogu P6815 [PA2009] Cakes 题解
三元环计数题。
无向图三元环计数分为三步:
\(1\) :给所有无向边重定向。记录每个点的度数,度数大的点指向度数小的点。如果度数相同,编号小的点指向编号大的点。最后这个图是有向无环图。
\(2\) :打标记。对于图中每一个点 \(u\),将其相邻的点标记可以被 \(u\) 到达。
\(3\) :统计答案。对于图中每一个点 \(u\),遍历其可以相邻的点 \(v\),如果 \(v\) 相邻的点 \(w\) 被标记可以被 \(u\) 到达,那么 \((u,v,w)\) 构成一个三元环。三元环不会被重复计算。
在这一题中,我们只需要对无向图三元环计数算法的第三步略微改动,当我们发现 \((u,v,w)\) 构成一个三元环时,将答案增加 \(\max(a_u,a_v,a_w)\) 即可。
由于无向图三元环计数算法复杂度为 \(O(m\sqrt{m})\),所以这个算法的时间复杂度为 \(O(m\sqrt{m})\)。
本题卡邻接表的常数,注意常数影响。
#include <bits/stdc++.h>
using namespace std;
struct edge
{
	int v,nxt;
}e[600000];
int n,m,a[200000],h[200000],b[200000],ind[200000],u[400000],v[400000],cnt=0;
long long ans=0;
void add_edge(int u,int v)
{
	e[++cnt].nxt=h[u];
	e[cnt].v=v;
	h[u]=cnt;
}
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-48;ch=getchar();}
	return x*f;
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=m;i++)u[i]=read(),v[i]=read(),ind[u[i]]++,ind[v[i]]++;
	for(int i=1;i<=m;i++)
	    if((ind[u[i]]>ind[v[i]])||(ind[u[i]]==ind[v[i]]&&u[i]<v[i]))add_edge(u[i],v[i]);
	    else add_edge(v[i],u[i]);
	for(int i=1;i<=n;i++)
	    {
	    for(int j=h[i];j;j=e[j].nxt)b[e[j].v]=i;
	    for(int j=h[i];j;j=e[j].nxt)
	        {
	        int ad=max(a[i],a[e[j].v]);
	        for(int k=h[e[j].v];k;k=e[k].nxt)
	            if(b[e[k].v]==i)ans+=max(ad,a[e[k].v]);
	        }
	    }
	printf("%lld",ans);
	return 0;
}
												
											Luogu P6815 [PA2009] Cakes 题解的更多相关文章
- Luogu P6815 [PA2009]Cakes
		
题意 给定一个 \(n\) 个点 \(m\) 条边的图,点 \(i\) 有权值 \(a_i\),一个三元环 \((i,j,k)\) 的贡献为 \(\max(a_i,a_j,a_k)\),求所有三元环的 ...
 - 【luogu P5022 旅行】 题解
		
题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...
 - BZOJ 3498 PA2009 Cakes(三元环处理)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3498 [题目大意] N个点m条边,每个点有一个点权a. 对于任意一个三元环(j,j,k ...
 - 【luogu P2831 愤怒的小鸟】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...
 - 【luogu P2827 蚯蚓】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P2827 35分:暴力sortO(mnlogn). 80分:考虑到每次不好维护不被切的点+q,正难则反.改成维护 ...
 - 【luogu P3959 宝藏】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P3959 我只是心血来潮想学SA(考场上骗分总行吧). 这个题可以状压DP.爆搜+剪枝.有意思的还是随机化搜索( ...
 - 【luogu P3410 拍照】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P3410 这个题就是求一个最大权闭合图 在一个图中,一些点构成一个集合,且集合中的出边指向的终点也在这个集合中, ...
 - 【luogu P1113 杂务】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P1113 菜 #include <queue> #include <cstdio> #i ...
 - 【luogu P4114 Qtree1】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...
 - 【luogu P3979 遥远的国度】 题解
		
题目链接:https://www.luogu.org/problemnew/show/P3979 除了换根操作都是裸的树剖 所以换根时考虑: 1.我查询的根等于换的根:无影响 2.我查询的根是换的根的 ...
 
随机推荐
- 使用Python可视化磁场
			
引言 随着科学技术的发展,物理学中的很多概念变得越来越复杂,但我们可以利用 Python 这一强大的工具,将一些抽象的物理现象变得更加直观易懂.今天,我们将以"磁场可视化"为主题, ...
 - Semaphore.acquire()方法的底层原理
			
一.acquire() 的工作流程 当调用 acquire() 方法时,实际调用的是 AQS 的 acquireSharedInterruptibly(1) 方法.以下是其详细工作流程: // acq ...
 - JAVA基础之多线程二期
			
一.主线程 public class MainThread { /** * 主线程:指执行main()方法的线程,且该线程是单线程,从上到下执行 * JVM执行main()方法时,JVM会将main( ...
 - Java 中堆和栈的区别是什么?
			
Java 中堆和栈的区别 Java 中的堆(Heap)和栈(Stack)是两种不同的内存区域,它们有着不同的用途和特点.以下是它们的主要区别: 1. 存储内容 堆:用于存储对象实例以及类的实例变量.所 ...
 - 容器原理之cgroup
			
" 以 docker 为代表,轻量.便携的 container 使得打包和发布应用非常容易.系列文章容器原理主要分析 container 用到的核心技术,主要包括 Linux namespa ...
 - Java基础之“数组扩容”
			
一.Java数组扩容的思路 正常逻辑:Java数组对象的大小是固定不变的,数组对象是不可扩容的. 尽然正常的不行,我们就在new他一次,利用数组复制方法可以变通的实现数组扩容. 逻辑:先弄出一个新的数 ...
 - Nacos源码—6.Nacos升级gRPC分析一
			
大纲 1.Nacos 2.x版本的一些变化 2.客户端升级gRPC发起服务注册 3.服务端进行服务注册时的处理 4.客户端服务发现和服务端处理服务订阅的源码分析 1.Nacos 2.x版本的一些变化 ...
 - 堆叠、MLAG、VPC、VSS 技术对比及架构建议
			
堆叠.MLAG.VPC.VSS 技术对比及架构建议 1. 堆叠(Stacking) 技术实现: 多台物理设备通过专用堆叠线缆(如华为的Stack.华三IRF.思科StackWise)或普通光纤/以太网 ...
 - 联邦学习图像分类实战:基于FATE与PyTorch的隐私保护机器学习系统构建指南
			
引言 在数据孤岛与隐私保护需求并存的今天,联邦学习(Federated Learning)作为分布式机器学习范式,为医疗影像分析.金融风控.智能交通等领域提供了创新解决方案.本文将基于FATE框架与P ...
 - vue3 基础-全局组件和局部组件
			
组件和页面的关系可以理解为, 组件是页面的一部分. 形象地理解组件 就和盖房子一样的, 可以将房子粗略拆分3个组件(组成部分) 房顶, 房身, 地基. 同时房顶又可以拆分 ..... 这样在极限的情况 ...