LC 3108. 带权图里旅途的最小代价
https://leetcode.cn/problems/minimum-cost-walk-in-weighted-graph/description/
这题挺有意思的,需要稍微想想来简化问题。
- 假设在一个连通图里面,存在A->B->C路径的话,到了C之后某些bit消失了。那么其实我们可以按照C->B->A返回来,这样的话从A起始的时候这个bit就消失了。
- 也就是说,如果在C点上bit消失了,那么在A点上bit也可以消失。
- 也就是说,在一个连通图里面,任何两点的最短距离其实是一个固定的值
- 这个固定的值是将整个连通图里面的所有weight进行AND,否则的话我们可以不断地尝试将bit unset掉。
class Solution: def minimumCost(self, n: int, edges: List[List[int]], query: List[List[int]]) -> List[int]: cut = [-1] * n adj = [[] for _ in range(n)] for u, v, w in edges: adj[u].append((v, w)) adj[v].append((u, w)) def dfs(x, c): cut[x] = c value = 0xffffffff for y, w in adj[x]: value &= w if cut[y] != -1: continue value &= dfs(y, c) return value c = 0 values = [] for i in range(n): if cut[i] != -1: continue value = dfs(i, c) values.append(value) c += 1 ans = [] for x, y in query: if cut[x] == cut[y]: ans.append(values[cut[x]]) else: ans.append(-1) return ans