首页 > 其他分享 >图论-分层图学习笔记

图论-分层图学习笔记

时间:2023-08-20 21:34:20浏览次数:54  
标签:图论 d% idx int 30 笔记 分层 ans

在前几天模拟赛中第一次见,之前不太理解,今天大概搞明白些了。


个人理解分层图:图中的边在特定的时间可以变换。那就将各个时间根据当前不同的状态分层建图。

说白了就是存各边的不同状态。连边时,同一层的点可以相连,不同层的也可以连过去。

所以你就会发现分层图的难度在于建图,连边的时候要考虑不同层的怎么连。其他的就是套最短路的板子了。

另外需要特别注意的是存图的时候空间还是尽量开到 1e6 比较保险吧。因为实际上你在不同层中连边的话边数还是挺大的。

图不太好画,不妨自己往“分层”这方面想象一下。


模板题:

1.洛谷:P2939 [USACO09FEB] Revamping Trails G

建图的时候,建 k 层图分别存不同高速公路下的情况。

对于同一层内的边,算出对应的编号,边权不变,直接相连。

不同层内的边,从第 i 层连向第 i + 1 层,表示在这里又使用了一次高速公路让边权成为 0。

for(int i = 0; i <= k; i ++ ) add(i * n + x, i * n + y, z), add(i * n + y, i * n + x, z);
for(int i = 0; i < k; i ++ ) add(i * n + x, (i + 1) * n + y, 0), add(i * n + y, (i + 1) * n + x, 0);

最后对于每一层的节点,直接跑最短路就可。

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const int N = 1e5 + 10;
const int M = 5e5 + 10;
int n, m, k;
int vis[N * 30], ans[N * 30];
int idx, head[N * 30], e[M * 30], w[M * 30], nxt[M * 30];
priority_queue<pair<int, int> > q;
void add(int x, int y, int z)
{
	e[++ idx] = y;
	w[idx] = z;
	nxt[idx] = head[x];
	head[x] = idx;
}
void dij()
{
	ans[1] = 0;
	q.push(make_pair(0, 1));
	while(q.size())
	{
		int x = q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x] = 1;
		for(int i = head[x]; i; i = nxt[i])
		{
			if(ans[e[i]] > ans[x] + w[i])
			{
				ans[e[i]] = ans[x] + w[i];
				q.push(make_pair(-ans[e[i]], e[i]));
			}
		}
}
}
int main()
{
	scanf("%d%d%d", &n, &m, &k);
	while(m -- )
	{
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		for(int i = 0; i <= k; i ++ ) add(i * n + x, i * n + y, z), add(i * n + y, i * n + x, z);
		for(int i = 0; i < k; i ++ ) add(i * n + x, (i + 1) * n + y, 0), add(i * n + y, (i + 1) * n + x, 0);
	}
	for(int i = 1; i <= n * k + n; i ++ ) ans[i] = inf; 
	dij();
	int minn = inf;
	for(int i = 0; i <= k; i ++ ) minn = min(minn, ans[i * n + n]);
	printf("%d", minn);
}

细细琢磨,分层图真的越想越妙。


其他:三倍经验:

P4568 [JLOI2011] 飞行路线

P4822 [BJWC2012] 冻结

标签:图论,d%,idx,int,30,笔记,分层,ans
From: https://www.cnblogs.com/Moyyer-suiy/p/17644604.html

相关文章

  • 【学习笔记】简单数论-高斯消元与线性空间
    友情提示本博客内部分内容因缺乏样例,可能晦涩难懂,建议参考蓝书或者数论小白都能看懂的线性方程组及其解法。线性方程组线性方程组是由\(M\)个\(N\)元一次方程共同构成的。线性方程组的所有系数可以写成一个\(M\)行\(N\)列的系数矩阵,再加上每个方程等号右侧的常数,可......
  • 点分树(动态点分治) 学习笔记
    模板题题目传送门给定一棵树(带点权),支持以下操作:修改点权。查询到一个点距离\(\lek\)的点的权值和。\(n,T\le10^5\)算法解析前置知识:点分治我们考虑把每次求出的重心和上一层的重心连边,我们就可以得到点分树。这棵树有以下性质:树高为\(\logn\),也就是暴力找LCA的......
  • MHATC系统笔记3
    Tip:1、NetRecord;参考链接:linux系统UDP丢包问题分析思路|CizixsWriteHere如何高效定位网络丢包问题?-知乎(zhihu.com)【翻译】理解TCP/IP网络栈|CizixsWriteHere1、tcpdump抓的包来自哪?内核TCPchecksum是网卡计算的,不是内核;如果有网络抓包工具(比如wireshark或......
  • 《Java编程思想第四版》学习笔记17
    崩溃JavaJava标准集合里包含了toString()方法,所以它们能生成自己的String表达方式,包括它们容纳的对象。例如在Vector中,toString()会在Vector的各个元素中步进和遍历,并为每个元素调用toString()。假定我们现在想打印出自己类的地址。看起来似乎简单地引用this即可(特别......
  • 我反对独立开发者做笔记产品:从商业角度看笔记产品市场竞争
    事情是这样的,刷掘金时看到这篇文章:良言难劝该死鬼,居然有人觉得独立开发做三件套是件好事,这篇文章提到了另一篇文章,是我很喜欢的一个公众号号主和菜头写的一篇《从番茄时钟和记账本开始》;之前在v2ex也看过相关讨论,于是打算好好思考下这件事情,于是在作者的文章下详细写了评价,一写写......
  • 学习笔记 - Java 面向对象_中
    this关键字当形参名和属性名相同时,使用this关键字来区分,有this修饰的变量是属性,无this修饰的是形参。this可以调用的除了属性,还有方法、构造器。所以,this指的是当前对象(在方法调用时)或当前正在创建的对象(在构造器中调用时)。在构造器中,使用this(形参列表);可以调用......
  • 笔记本电脑主板的细微伤痕:一场与微观世界的舞蹈
    引言:微小的伤痕,巨大的影响有一天,我在检查一台笔记本电脑时,发现了一个微小的细节——主板上的绝缘层有一点被磨损了。这样一个微不足道的伤口,竟然引领了我走入了一个丰富多彩的微观世界。第一幕:一个小小的问题,隐藏的危机伤口的解剖学:细微的危险在我们的笔记本电脑的主板(Motherb......
  • CSS笔记-盒子模型
    CSS笔记-盒子模型1.盒子模型css开发中,常常会提到一个词叫做“盒子”,这里的盒子专业名词叫“盒子模型(BoxModel)”,这一术语是从来设计和布局时使用的。通俗的讲,所有的HTML元素都可以看做是一个盒子;那么,将页面中所有的元素都设置成一个矩形的盒子后,对页面的布局就可以理解成把不......
  • Hadoop学习笔记、知识点搭建速过、包含Hadoop集群搭建、HDFS、IDE操作hadoop,DFSShell
    大数据概述......
  • 操作系统学习笔记
    Stanford:CS140使用操作系统概念CS162使用操作系统:设计与原理基础操作系统发展史原始操作系统在原始操作系统中,程序更多的是与硬件进行绑定,是一个无保护的标准服务库(为了方便用户或开发者使用而提供的一系列标准服务、函数或API)。系统一次只能运行一个程序多任务处理......