首页 > 其他分享 >洛谷 P1613 跑路 做题记录

洛谷 P1613 跑路 做题记录

时间:2024-11-20 16:55:48浏览次数:1  
标签:洛谷 记录 int vis read maxn mod P1613 define

前置芝士:最短路、floyd 传递闭包、倍增

思路

看到题目里面的一次能走 \(2^k\) 千米,我们联想到倍增,因为只能用跑路器
我们枚举 \(k\),然后做一次传递闭包,\((i,j)\) 走 \(2^k\) 千米是相连的,当且仅当有一个点 \(k\) 是的 \((i,k),(k,j)\) 可以通过走 \(2^{k-1}\) 千米相连。此时,\((i,j)\) 的距离为 \(1\)。
\(n\) 不大,跑 floyd 就好了。

时间复杂度:\(O(wn^3)\),其中 \(w\) 是 int 位数。
难点/坑点:

  • 不要将自己和自己设置为走 \(2^0\) 步相连的,因为自己到自己并没有步数,在跑 floyd 传递闭包时可能会遇到 \(i=k\) 的情况(\(k\) 是第一个枚举的,\(i\) 是第二个),那么就会有 \((i,j)\) 明明是走 \(2^{k-1}\) 步相连的推出 \((i,j)\) 是走 \(2^k\) 步相连。
点击查看代码
#include<bits/stdc++.h>

#define ll long long
#define i128 __int128
#define int ll
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 55
int n,m;
vector<int> G[maxn];
bool vis[35][maxn][maxn];
int f[maxn][maxn];
void work() {
	mem(f,0x3f);
	in2(n,m);
	For(i,1,n) f[i][i]=0;
	For(i,1,m) {
		int u,v;
		in2(u,v);
		vis[0][u][v]=1;
		f[u][v]=min(f[u][v],1ll);
	}
	For(x,1,32) For(k,1,n) For(i,1,n) For(j,1,n)
		if(vis[x-1][i][k]&&vis[x-1][k][j])
			vis[x][i][j]=1,f[i][j]=min(f[i][j],1ll);
		
	For(k,1,n) For(i,1,n) For(j,1,n)
		f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
	cout<<f[1][n];
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	int _=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

标签:洛谷,记录,int,vis,read,maxn,mod,P1613,define
From: https://www.cnblogs.com/CodingGoat/p/18558781

相关文章

  • 11.20 CW 模拟赛 赛时记录
    看题前言:花了\(10\rm{min}\)把昨天的题调了一下,神经\(\rm{T1}\)艹,再一次缺失大样例神秘博弈放\(\rm{T1}\),大抵可做(主要原因是\(\rm{lhs}\)键盘敲得框框响)手玩几组数据大概能做,后面再认真看\(\rm{T2}\)看到树直接小命不保喵了个咪的,这我打鸡毛啊又......
  • macOS系统的一些使用记录
    命令设置启动台图标数量设置#设置每行最多10个应用图标defaultswritecom.apple.dockspringboard-columns-int10#设置每页最多6行defaultswritecom.apple.dockspringboard-rows-int6#重建LaunchPad数据库defaultswritecom.apple.dockResetLaunchPad-boolT......
  • 【题解】洛谷:P8593 「KDOI-02」一个弹的投
    P8593「KDOI-02」一个弹的投物理题。首先你要搞懂什么时候会炮弹碰撞,结论:y坐标相同时,水平位置\(x_i\lex_j\)且落点满足\(d_i\ged_j\),两炮弹必然碰撞。但是为什么呢,像我这种完全没学高中物理的伪高中生就不会了,下落时每个物体的相对的高度差是不变的,因为根据伽利略运动独......
  • 【洛谷】P1914 小书童——凯撒密码
    题目背景某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你。题目描述蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过50个小写字母组成)中每个字母向后移动 n 位形成的。z 的下一个字母是 ......
  • 洛谷题单指南-二叉堆与树状数组-P2161 [SHOI2009] 会场预约
    原题链接:https://www.luogu.com.cn/problem/P2161题意解读:本题前面形式化描述已经足够清晰。解题思路:要判断线段之间是否有冲突(包含或者交叉),可以借助set,参考:https://www.cnblogs.com/jcwy/p/18447333只不过这里要统计冲突的数量,也就是允许相等的元素重复存在,可以借助multiset......
  • 第一次指令微调大模型记录
    制作数据集fromsklearn.metricsimportaccuracy_score,f1_scorefromsklearn.linear_modelimportLogisticRegressionimportdatasetsimportnumpyasnpimporttorchfromllm2vecimportLLM2Vecfromhuggingface_hubimportloginimportos#/root/data/kczx/cac......
  • 23.ORM之多对多查询记录
    1.一(班级表)对多(学生表)查询一个学生的班级id和跨表查询查询一个学生的班级名称2.一(班级表)对多(学生表)查询所有学生名称和跨表查询对应的班级名称3.多(课程表)对多(学生表)从Student表的外键字段courses,跳到Course表中的外键字段teacher,在Teacher表中用`__name`获取课程的对应的老师名......
  • 零基础逆向学习记录6
    逆向学习记录之汇编基础61.什么是堆栈平衡?<1>如果要返回父程序,则当我们在堆栈中进行堆栈的操作的操作的时候,一定要保证ret这条指令之前,esp指向的是我们压入栈中的地址,即返回call的下一行。<2>如果通过堆栈传递参数了。那么在函数执行完毕之后,要平衡参数导致的堆栈变化。......
  • edusrc—记录一次某证书站捡漏拿下证书实战,网络安全零基础入门到精通教程!
    一、信息收集测试证书站首先得对他的资产收集一波首先,在icp备案查询网站查询备案的主域名有哪些https://beian.miit.gov.cn/img然后利用子域名收集工具对二级子域名,三级子域名进行收集,扩大资产范围我一般用oneforall这个工具收集资产,挺好用的,这里放上链接https://gi......
  • [考试记录] 2024.11.19 noip模拟赛17
    T1选取字符串warning❗:本题解前缀含量过高。挺典的kmp。考虑到题目中的串都是一个串的前缀,那么所选出来的串,他们的前缀一定是最短的那个串。不妨直接枚举每一个前缀,也就是枚举每一个串,看他们是否可以作为前缀出现,hash即可,复杂度\(\mathcal{O}(N^2)\)。换个思路,考虑有多......