首页 > 其他分享 >空间转移(dp+倍增+Floyd)

空间转移(dp+倍增+Floyd)

时间:2024-02-16 22:13:36浏览次数:22  
标签:int memset Floyd 次方 sizeof 倍增 dp dis

第2题     空间转移 查看测评数据信息

给定一个n个点,m条边的有向图,编号从1到n,所有边权值是1,现在有一个动点从点1开始一动,其每秒钟可以移动 2的k次方千米(k 是任意自然数,且2的k次方不超过1000000000)。最少需要几秒才能到达n号点。数据保证 1 到 n至少有一条路径。n⩽50,m⩽10000

输入格式

 

第一行两个整数 n,m,表示点的个数和边的个数。

接下来 m行每行两个数字 u,v,表示一条 u 到 v 的边。

 

输出格式

 

一行一个数字,表示到公司的最少秒数。

 

输入/输出例子1

输入:

4 4

1 1

1 2

2 3

3 4

 

输出:

1

 

样例解释

 

 

 首先建一个新图,把2的k次方千米能到的点连一条边权为1的路,再跑一遍最短路即可

但是我们怎么知道2的k次方千米能到的点呢?

 我们找一个中间点c,看看ac一步走到,cb也可以一步走到,那么a,b就可以一步走到

所以我们要记录一下走的状况,f[步数][a][b]=1/0,表示是否能1步走到

#include <bits/stdc++.h>
using namespace std;

const int N=55, M=65;
int n, m, u1, v1, f[N][N][M], dis[N][N]; 
int main() 
{
	memset(f, 0, sizeof f);
	memset(dis, 63, sizeof dis);
	
	scanf("%d%d", &n, &m);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d", &u1, &v1);
		f[u1][v1][0]=1;
		dis[u1][v1]=1;
	}
	for (int op=1; op<=64; op++)
		for (int k=1; k<=n; k++)
			for (int i=1; i<=n; i++)
				for (int j=1; j<=n; j++)
					if (f[i][k][op-1] && f[k][j][op-1])
					{
						f[i][j][op]=1;
						dis[i][j]=1;
					}
	
	for (int k=1; k<=n; k++)
		for (int i=1; i<=n; i++)
			for (int j=1; j<=n; j++)
				if (dis[i][j]>dis[i][k]+dis[k][j])
					dis[i][j]=dis[i][k]+dis[k][j];
	
	printf("%d", dis[1][n]);
	return 0;
}

  

 

附之前的截图

 

 

 

标签:int,memset,Floyd,次方,sizeof,倍增,dp,dis
From: https://www.cnblogs.com/didiao233/p/18017554

相关文章

  • ThreadPoolTaskExecutor以及通过注解实现异步任务
    ThreadPoolTaskExecutor是Spring框架的线程池,实现方式如下:1//声明一个name为asyncTaskExecutor的线程池bean到容器中2@Bean("asyncTaskExecutor")3publicExecutorgetAsyncExecutor(){4ThreadPoolTaskExecutorthreadPoolExecutor=newThreadPoolTaskExecuto......
  • 状压 dp 与 插头 dp
    矩阵上的dp:按格dp/轮廓线dp设\(f[i,j,S]\)表示考虑到第\(i\)行第\(j\)个格子,轮廓线上所有的格子的状态。复杂度为\(\Theta(nm|S|)\)。按行dp\(f[i,S]\)表示选完前\(i\)行的合法方案数。总复杂度为\(\Theta(n|S|^2)\)。P3226[HNOI2012]集合选数给定集合......
  • [学习笔记]换根 DP 的常用处理方式
    [学习笔记]换根DP的常用处理方式换根DP,又称作二次扫描法,通常用于“对每个根求出树形DP的答案”。以每个点作为根节点进行一次树形DP的代价通常无法承受,因此我们会使用两次DFS:第一次DFS指定一个点为根节点,运行一次常规的树形DP。第二遍DFS进行换根DP,得到将根转移......
  • DP 做题记录
    复杂DP各种巨大DP。CF123CBrackets题意:括号数组是一个只有“(”或“)”两类字符的二维数组。括号数组中的合法路径只能从任意位置开始,向右或向下移动。如果一个n×m括号数组中从(1,1)到(n,m)的所有路径经过的字符构成的字符串均为可以完全匹配的括号序列,则这个括号......
  • DP 优化
    DP优化一些典型或者不典型的DP优化实例。CF354DTransferringPyramid题意:有一个\(n\)层的金字塔,现在能进行两种操作,一是给某个点染色,代价是3,或者画一个底边是金字塔底边的子三角形,给每个点,代价是点数+2,要求用最小代价覆盖所有要染色的\(m\)个点。思路:定义\(h_i\)表......
  • 【无评级杂题】DP/贪心
    题目这题后来看了看网上的思路,发现贪心就能做,亏我还写了个O(2*N)的DP...浪费时间了属于是my-code#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cstdlib>#include<algorithm>#include<stack>#include<queue>......
  • 树形 DP
    简单的树上dp其实已经在普及组涉及过:自上而下和自下而上传递的性质。现在我们需要研究更复杂的树上dp,比如换根dp等等。【树上dp】最大子树和给出一棵带点权的树,求这棵树中的最大权连通块。因为是无根树,我们人为规定1号结点为根。\(dp[i]\)表示以\(i\)为根的子树......
  • 区间 DP
    思路:按区间的\(len\)从小到大DP,枚举左端点,算出右端点,再枚举中间的分界点转移有可能是向左右两端各扩展\(1\)步还有时要记录在左/右端点,分开转移把问题划分为区间长度更短的最优子结构注意\(len=1\)时初始化及边界P4342[IOI1998]Polygon这题已经说了去掉一条边后执......
  • 高维前缀和(SOS DP)
    高维前缀和(SOSDP)通常求二维前缀和,用容斥来求但其实,完全可以先做一遍行的前缀和,再做一遍列的前缀和拓展到\(k\)维也是如此,可以在\(O(nk)\)的复杂度求前缀和但怎么和DP扯上关系?可以把第\(i\)维当作阶段,每一维的具体信息是状态先枚举阶段,表示当前固定其它维,只统计这一......
  • TCP和UDP面试题提问
    @目录TCPUDP总结应用TCP(传输控制协议)和UDP(用户数据报协议)是两种计算机网络通信协议,它们在网络通信中起着不同的作用。TCPTCP是面向连接的协议,它在数据传输之前需要在发送端和接收端建立一条连接。TCP提供可靠的数据传输,它使用确认和重传机制来确保数据的可靠性和完整性。T......