P5839-图论-Floyd算法

在搜索中bfs只适合无权图

若是碰到有权图最简单的方法就是用邻接矩阵-二维矩阵存储每个点对之间的权重,然后用floyd

1.邻接矩阵

如果是二维输入权值的话直接append就好了

python 复制代码
ma=[]

for i in range(m):
    ma.append(list(map(int,input().split())))

点对输入情况的:

INF初始化定义没有边无法到达

然后对每个点到自己定义为0,也就是没距离

同时用min读入来处理重边(i到j不止一条路,那么优先选短的)

python 复制代码
INF=float('inf')
ma=[[INF]*n for _ in range(n)]

for i in range(n):
    ma[i][i]=0

for i in range(m):
    a,b,c=map(int,input().split())
    ma[a-1][b-1]=min(ma[a-1][b-1],c)
    ma[b-1][a-1]=min(ma[b-1][a-1],c)

2.floyd算法

本质其实是动态规划

ma数组存储的是每个点之间的直接距离,并没有考虑从中节点经过的情况

那么我们只需要再枚举在 i、j 点之间的所有可能点k,用min存储更小的途径

python 复制代码
def floyd(ma):
    for k in range(m):
        for i in range(m):
            for j in range(m):
                ma[i][j]=min(ma[i][j],ma[i][k]+ma[k][j])
    return ma

如果原来的ma数组还会用到,那么最好复制一下ma

python 复制代码
        d=[[ma[i][j] for j in range(m)] for i in range(m)]

注意:不能用dist=ma.copy()

因为二维数组的浅拷贝会导致对拷贝体做更改的时候会影响本体

python 复制代码
a=[1,2,3]
a2=a.copy()
a2.append(4)
print(a,a2)

print()

b=[[1,2],[3]]
b2=b.copy()
b2[1].append(4)
print(b,b2)

'''输出
[1,2,3] [1,2,3,4]
[[1,2],[3,4]] [[1,2],[3,4]] 
'''

P5839

P5839 [USACO19DEC] Moortal Cowmbat G - 洛谷

首先我们跑一边floyd得出最小代价

python 复制代码
INF = float('inf')

n, m, k = map(int, input().split())
s = input()
ma = [list(map(int, input().split())) for _ in range(m)]

def floyd(ma):
    d = [[ma[i][j] for j in range(m)] for i in range(m)]
    for k in range(m):
        for i in range(m):
            for j in range(m):
                d[i][j] = min(d[i][j], d[i][k] + d[k][j])
    return d

d = floyd(ma)

后面就是得规划我们该如何变我们的字符串

dp状态: F[ i ]表示到i位置全部合法的最小代价

dp转移: F[ i ]=F[ j ]+k( i,j ) 其中k( i,j )表示 i 到 j 全部改为一种颜色的最小代价,这里可以用前缀和进行预处理

python 复制代码
#前缀和
su = [[0]*(n+1) for i in range(m)]

for i in range(m):
    for j in range(1, n+1):  # 从1开始到n
        su[i][j] = su[i][j-1] + d[ord(s[j])-ord('a')][i]

f = [INF]*(n+1)
f[0] = 0
mx = [0]*m
for i in range(k, n+1):
    for col in range(m):
        mx[col] = max(mx[col], su[col][i-k]-f[i-k])
    for col in range(m):
        f[i] = min(f[i], su[col][i]-mx[col])
print(f[n])
相关推荐
云手机掌柜23 分钟前
从0到500账号管理:亚矩阵云手机多开组队与虚拟定位实战指南
数据结构·线性代数·网络安全·容器·智能手机·矩阵·云计算
Eloudy3 小时前
简明量子态密度矩阵理论知识点总结
算法·量子力学
点云SLAM3 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
没书读了3 小时前
考研复习-数据结构-第八章-排序
数据结构
算法_小学生4 小时前
支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战
算法·机器学习·支持向量机
waveee1235 小时前
学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
数据结构·数据库·学习
iamlujingtao5 小时前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
算法_小学生5 小时前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归
DebugKitty5 小时前
C语言14-指针4-二维数组传参、指针数组传参、viod*指针
c语言·开发语言·算法·指针传参·void指针·数组指针传参
qystca6 小时前
MC0241防火墙
算法