首页 > 其他分享 >浅谈分层图

浅谈分层图

时间:2024-09-01 21:15:01浏览次数:9  
标签:110005 head 浅谈 int d% 分层 et dis

# 用途

- 解决一些在带权图中,最多 $k$ 次优惠**一条边权**

# 基本步骤

1. 分成 $k+1$ 层,从 $0$ 好开始,每层图与原图一样。其中第 $i$ 层图是用了 $i$ 次优惠到达的图。
2. 对于所有边,若在第 $i$ 层图中,那么就新连一条边从 $u$ 指向第 $n+1$ 层图的 $v$,权值为**优惠的值**。
3. 再跑 $dij$ 或 $spfa$ 就行了

# 例题

## [P4568 [JLOI2011] 飞行路线](https://www.luogu.com.cn/problem/P4568)

### 思路

我的评价:板子

直接按照基本步骤写,优惠的值就是 $0$

### 注意事项

1. 一定要建双向边
2. 如果用前向星,数组记得开大一点

### 代码

```cpp
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define se second
const int N=1e6+5;
int n,m,k;
int s,t;
int et=0,head[110005];
struct edge
{
	int v,w,nxt;
}e[2500005];
inline void add(int u,int v,int w=0)
{
	et++;
	e[et].v=v,e[et].w=w,e[et].nxt=head[u];
	head[u]=et;
}
int dis[110005],vis[110005];
void dij()
{
	memset(dis,0x3f,sizeof dis);
	dis[s]=0;
	priority_queue<pii,vector<pii>,greater<pii> > q;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int u=q.top().se;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt)
		{
			int v=e[i].v,w=e[i].w;
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				q.push(make_pair(dis[v],v));
			}
		}
	}
}
int main()
{
	scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
	for(int i=1,u,v,c;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&c);
		add(u,v,c);
		add(v,u,c);
		for(int j=1;j<=k;j++)
		{
			add(u+(j-1)*n,v+j*n);
			add(v+(j-1)*n,u+j*n);
			add(u+j*n,v+j*n,c);
			add(v+j*n,u+j*n,c);
		}
	}
	for(int i=1;i<=k;i++)
	{
		add(t+(i-1)*n,t+i*n);
	}
	dij();
	cout<<dis[t+k*n];
	return 0;
}

标签:110005,head,浅谈,int,d%,分层,et,dis
From: https://www.cnblogs.com/tyccyt/p/18391740

相关文章

  • 浅谈欧拉函数
    欧拉函数定义对于任意的正整数\(n\),欧拉函数\(\phi(n)\)表示小于等于\(n\)的所有数中与\(n\)互质的数的个数。暴力实现那么根据定义,不难直接打出一个时间复杂度\(O(n)\)的代码,枚举所有小等于\(n\)的数字\(i\),若\(\gcd(n,i)=1\)则答案\(+1\)。代码:#include<bi......
  • 浅谈搜索
    迭代加深搜索定义迭代加深是一种每次限制搜索深度的深度优先搜索。解释迭代加深搜索的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度\(d\),当\(d\)达到设定的深度时就返回,一般用于找最优解。如果一次搜索没有找到合法的解,就让设定的深度加一,重新从根开始。代码......
  • 浅谈 Occupancy
    01研究意义OccupancyNetwork算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。OccupancyNetwork算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法去预测每个......
  • C# 一分钟浅谈:第一个 C# 控制台应用程序
    引言C#是一种现代化的、面向对象的编程语言,广泛应用于各种领域,包括桌面应用程序、Web应用、游戏开发等。对于初学者而言,从创建一个简单的控制台应用程序开始学习C#是一个非常好的起点。本文将详细介绍如何创建第一个C#控制台应用程序,并探讨一些常见的问题及其解决方案。准......
  • C# 一分钟浅谈:变量与数据类型简介
    引言在C#编程中,了解和使用变量与数据类型是非常基础且重要的一步。正确的数据类型选择不仅能够提高程序的性能,还能避免许多潜在的问题。本文将详细介绍C#中常见的数据类型和变量的使用方法,并探讨一些常见的问题及其解决方法。常见数据类型C#中的数据类型主要分为两大类:值......
  • OpenHarmony开发:应用分层架构设计
    HarmonyOS应用的分层架构设计以一套代码工程为基础,旨在为华为的手机、2in1等1+8全场景设备提供支持,实现了“一次开发,多端部署”的开发理念。HarmonyOS应用的分层架构主要包括三个层次:产品定制层、基础特性层和公共能力层,为开发者构建了一个清晰、高效、可扩展的设计架构。本......
  • 浅谈摩尔投票法
    问题引入给定\(n\)个数\(a_i\),求出该数列的绝对众数,保证该绝对众数存在。\(n\le10^7\),空间限制1MB。算法介绍摩尔投票法可以\(O(1)\)空间\(O(n)\)时间内求出一个数列的绝对众数,使用前提是数列保证存在绝对众数,否则你只能求出一个可能是绝对众数的数,这时你还需要使用......
  • 浅谈Java loombook框架
    一、基本介绍        Java的LoomProject是一个处于早期开发阶段的项目,旨在为Java平台添加轻量级的协程支持。协程是一种比线程更加轻量级的存在,它可以在一个线程中并发执行多个任务,从而减少上下文切换的开销,并提高系统的吞吐量。        LoomProject提......
  • java.time包时间类浅谈
    Java早期日期时间API:java.util.Date与java.util.Calendar一、背景在Java的早期版本中,处理日期和时间的需求主要由java.util.Date类和随后加入的java.util.Calendar类来满足。这两个类在Java1.0和Java1.1中分别被引入,为Java程序提供了基本的日期和时间操作能力。然而,随着......
  • 【环境部署系列】浅谈灾难恢复站点:冷/暖/热站点
    原创祺印说信安一般来说,备用站点是指将人员及其工作所需的设备重新安置一段时间,直到恢复或更换正常生产环境为止的站点。包含完全冗余的硬件和软件,具有电信、电话和公用事业连接,以继续所有主要站点的操作。根据维基百科的资料解释,站点通常根据准备程度和投入运行的速度进行......