简单图论:迷路

这篇具有很好参考价值的文章主要介绍了简单图论:迷路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

迷路

题目描述

windy 在有向图中迷路了。

该有向图有 n n n 个节点,节点从 1 1 1 n n n 编号,windy 从节点 1 1 1 出发,他必须恰好在 t t t 时刻到达节点 n n n

现在给出该有向图,你能告诉 windy 总共有多少种不同的路径吗?

答案对 2009 2009 2009 取模。

注意:windy 不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

输入格式

第一行包含两个整数,分别代表 n n n t t t

2 2 2 到第 ( n + 1 ) (n + 1) (n+1) 行,每行一个长度为 n n n 的字符串,第 ( i + 1 ) (i + 1) (i+1) 行的第 j j j 个字符 c i , j c_{i, j} ci,j 是一个数字字符,若为 0 0 0,则代表节点 i i i 到节点 j j j 无边,否则代表节点 i i i 到节点 j j j 的边的长度为 c i , j c_{i, j} ci,j

输出格式

输出一行一个整数代表答案对 2009 2009 2009 取模的结果。

样例 #1

样例输入 #1

2 2
11
00

样例输出 #1

1

样例 #2

样例输入 #2

5 30
12045
07105
47805
12024
12345

样例输出 #2

852

提示

样例输入输出 1 解释

路径为 1 → 1 → 2 1 \to 1 \to 2 112

数据规模与约定
  • 对于 30 % 30\% 30% 的数据,保证 n ≤ 5 n \leq 5 n5 t ≤ 30 t \leq 30 t30
  • 对于 100 % 100\% 100% 的数据,保证 2 ≤ n ≤ 10 2 \leq n \leq 10 2n10 1 ≤ t ≤ 1 0 9 1 \leq t \leq 10^9 1t109

解题思路

矩阵快速幂

由于题目中给出的 t t t 范围很大,故此题不能直接使用图论或者动态规划的方法。
简易版本
假设先不考虑每条路径间的具体距离,只用 0,1 表示两个结点间边连接的情况,可以使用邻接矩阵表示输入的有向图,该邻接矩阵记为 A A A

在矩阵中,一个存i到j路径数的矩阵自乘k次,a[i][j]表示从i到j走k步的路径数
证明 c [ i ] [ j ] + = a [ i ] [ k ] ∗ b [ k ] [ j ] c[i][j]+=a[i][k]*b[k][j] c[i][j]+=a[i][k]b[k][j]
枚举一个中间点,用乘法原理,i到j两步的路径数等于i到k一步的路径数乘k到j一步的路径,然后再对于不同的中间点用加法原理,每次都枚举了i能到的所有点,以及能到j的所有点。
即矩阵 A x [ i ] [ j ] A^x[i][j] Ax[i][j] 的值为结点 i i i 走到结点 j j j 经过 x x x 步的情况数。因此,如果只有 0,1 表示两个结点间边连接的情况,那我们就可以通过矩阵快速幂的方式求解。
实际——带权重
因为边权可能为1~9,如果直接存进矩阵的话,存边权显然是不可取的,表示有边权数条路径,存1好像成了一步就能到。
1、输入的结点不超过 10 个
2、两两结点之间的距离也不超过 10
拆解节点——把一个结点拆成 10 份,通过结点内部分结点的连接来模拟不同结点间的距离。这样,拆完结点后邻接矩阵的大小也不会超过 100 × 100 100\times100 100×100

通过拆点操作将距离不为 1 的结点一一转化为只有 0,1 的邻接矩阵后,就可以使用矩阵快速幂求解了。

Code

Python3

由于 Python 语言本身执行效率较低,因此该代码直接提交会超时,完成最大的测试用例时间在 11s 左右。文章来源地址https://www.toymoban.com/news/detail-518275.html

# -*- coding: utf-8 -*-
# @Author : BYW-yuwei
# @Software: python3.8.6
MOD=2009
n,t=map(int,input().split())

spn=n*10
class matrix:
    def __init__(self):
        self.m=[[0]*205 for i in range(205)]
    def __mul__(self,other):
        res=matrix()
        for i in range(1,spn+1):
            for j in range(1,spn+1):
                for k in range(1,spn+1):
                    res.m[i][j]=(res.m[i][j]+self.m[i][k]*other.m[k][j])%MOD
        return res

def check(i:int,j:int):
    return (i-1)*10+j

def power(x:matrix,n:int):
    ans=matrix()
    for i in range(1,spn+1):
        ans.m[i][i]=1
    while n:
        if n&1:
            ans=ans*x
        x=x*x
        n>>=1
    return ans


A=matrix()
for i in range(1,n+1):
    for j in range(1,10):
        A.m[check(i,j)][check(i,j+1)]=1
    dis=[0]+[int(j) for j in input()]
    for j in range(1,n+1):
        if dis[j]:
            A.m[check(i,dis[j])][check(j,1)]=1
    
res=power(A,t)
print(res.m[1][10*n-9])

到了这里,关于简单图论:迷路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 不写代码开启Restful服务

    很久没有写文章了,不管什么原因,总觉得心里还是觉得有点焦虑,不看看书写点东西就有莫名的焦虑,仿佛只有忙起来才能忘记焦虑。虽然我也知道更重要的是思考方向,但是就像走路,不出发随着时间的流逝,总觉得有种焦虑感,总觉得一直走在路上,才有踏实的充实感

    2024年02月16日
    浏览(36)
  • 牛叉,一行代码不写,就可以开发系统

    如今AI和低代码越来越火,可以瞬间完成一个系统的开发。 不用一行代码,轻松实现业务数字化,是怎么做到的? 前面小孟开发了大量的系统,很多时候不是我写代码多么快,也不是我技术多么的厉害,而是我工具选择的好。 今天给大家分享一波。 先看一下我常用的低代码

    2024年02月07日
    浏览(47)
  • 不写代码也能年薪百万?Prompt+低代码开发实战

    👉腾小云导读 近期 AIGC 狂潮席卷,“前端走向穷途”“低代码时代终结”的言论甚嚣尘上。事实上 GPT 不仅不会干掉低代码,反而会大幅度促进低代码相关系统的开发。本文会介绍 GPT Prompt Engineering 的基本原理,以及如何帮助低代码平台相关技术快速开发落地的技术方案。接

    2024年02月16日
    浏览(45)
  • 软件工程师,要么不写代码,要么就写优雅的代码

    何为优雅的代码         优雅的代码,至少需要遵循以下几个原则:          遵守规范         优雅的代码,首先让人看起来就是很整洁的。而这种整洁,则来源于代码规范。严格地遵守代码规范,是提高且保证代码质量的最有效方法。从个人开发的角度来看,一

    2024年02月06日
    浏览(56)
  • 关于程序员不写代码注释这一件事

    博主个人写代码是肯定会写注释的,哪怕是简单的功能,文档注释、多行注释、单行注释怎么顺手怎么用,让一个小白也能看懂自己的代码。 博主认为程序员不写注释的原因无外乎以下几点: 1、太懒了,就是单纯不想写 2、平时没有养成写代码注释的习惯 3、作为一个程序员

    2024年02月07日
    浏览(40)
  • 【华为OD机试真题】1105 - 简单的解压缩算法(JAVA C++ Python JS) | 机试题+算法思路+考点+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

    2024年02月05日
    浏览(38)
  • 【华为OD机试真题 】1105 - 简单的解压缩算法(JAVA C++ Python JS) | 机试题+算法思路+考点+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Java语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习

    2024年02月05日
    浏览(65)
  • 不写一行代码(一):实现安卓基于GPIO的LED设备驱动

    第1篇 :不写一行代码(一):实现安卓基于GPIO的LED设备驱动 第2篇 :不写一行代码(二):实现安卓基于PWM的LED设备驱动 第3篇:不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动 安卓设备驱动,本质上依旧还是Linux架构的驱动程序,基于Linux Kernel。在做安卓ROM开发的过程中

    2024年02月05日
    浏览(43)
  • 使用ChatGPT完成程序开发——目标:不写一行代码完成图像识别并点击

            本文作为一个使用AI开发的思路,让更多的人可以利用AI完成一些简单的程序,文中使用的是国内镜像GTP3.5 源码: GitHub - kasimshi/testCV: AI编写的OpenCV图像识别例子 GTP镜像:     对AI描述我们要做的功能,让它给给初步的思路和方向 作为新手,让AI推荐容易使用的相关

    2023年04月25日
    浏览(41)
  • 不写一行代码,智汀帮你轻松将米家智能家居接入HomeKit

    小编曾写过不少关于通过智汀将米家接入HomeKit的教程,尽管步骤和方法相对来说都挺简单的,但很多都需要代码来进行操作。这对于有编程基础的朋友来说不难,但对普通人来说,特别是不懂代码的,有一定程度上的难度。比如我之前发完教程后,有不少朋友私信求助,他们

    2024年02月16日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包