deflcm(a,b): x,y=a,b while y: x,y=y,x%y returnint((a*b)/x) defdijkstra(graph,starting_node,node_num):#graph[u][v]表示边e=(u,v)的权值,不存在时设为inf # 起始节点starting_node,节点数量node_num used = [Falsefor _ inrange(node_num)] # 标记数组,used[v]值为False说明该顶点还没有访问过,在S中,否则在U中! distance = [float('inf') for _ inrange(node_num)] # 距离数组,distance[i]表示从原点s到i的最短距离,distance[s]=0 #cost = [[float('inf') for _ in range(node_num)] for _ in range(node_num)] # cost[u][v]表示边e=(u,v)的权值,不存在时设为inf distance[starting_node]=0 whileTrue: v=-1#v在这里相当于是一个哨兵,对包含起点s做统一处理! for u inrange(node_num):#从未使用过的顶点中选择一个距离最小的顶点 ifnot used[u] and (v==-1or distance[u]<distance[v]): v=u if v==-1:#说明所有顶点都维护到S中了! break used[v]=True#将选定的顶点加入到S中,同时进行距离更新 for u inrange(node_num):#更新U中各个顶点到起点s的距离.之所以更新U中顶点的距离,是因为上一步中确定了k是求出的最短路径节点 distance[u]=min(distance[u],distance[v]+graph[v][u])
return distance
#建图....begin cost = [[0for _ inrange(2021)] for _ inrange(2021)] for i inrange(2021): for j inrange(2021): if (abs((i+1)-(j+1))<=21): w=lcm(i+1,j+1) cost[i][j]=w elif (abs((i+1)-(j+1))>21): cost[i][j]=float('inf') if (i==j): cost[i][j] = 0 #建图....end print(dijkstra(cost,0,2021))