Skip to content

Commit 0b44537

Browse files
authored
feat: add solutions to lc problem: No.2959 (#2082)
No.2959.Number of Possible Sets of Closing Branches
1 parent 408701e commit 0b44537

File tree

7 files changed

+540
-6
lines changed

7 files changed

+540
-6
lines changed

solution/2900-2999/2959.Number of Possible Sets of Closing Branches/README.md

Lines changed: 184 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,34 +86,215 @@
8686

8787
<!-- 这里可写通用的实现逻辑 -->
8888

89+
**方法一:二进制枚举 + Floyd 算法**
90+
91+
我们注意到 $n \leq 10$,所以我们不妨考虑使用二进制枚举的方法来枚举所有的分部集合。
92+
93+
对于每个分部集合,我们可以使用 Floyd 算法来计算出剩余分部之间的最短距离,然后判断是否满足题目要求即可。具体地,我们先枚举中间点 $k$,再枚举起点 $i$ 和终点 $j$,如果 $g[i][k] + g[k][j] \lt g[i][j]$,那么我们就用更短的距离 $g[i][k] + g[k][j]$ 更新 $g[i][j]$。
94+
95+
时间复杂度 $O(2^n \times (n^3 + m))$,空间复杂度 $O(n^2)$。其中 $n$ 和 $m$ 分别是分部数量和道路数量。
96+
8997
<!-- tabs:start -->
9098

9199
### **Python3**
92100

93101
<!-- 这里可写当前语言的特殊实现逻辑 -->
94102

95103
```python
96-
104+
class Solution:
105+
def numberOfSets(self, n: int, maxDistance: int, roads: List[List[int]]) -> int:
106+
ans = 0
107+
for mask in range(1 << n):
108+
g = [[inf] * n for _ in range(n)]
109+
for u, v, w in roads:
110+
if mask >> u & 1 and mask > v & 1:
111+
g[u][v] = min(g[u][v], w)
112+
g[v][u] = min(g[v][u], w)
113+
for k in range(n):
114+
if mask >> k & 1:
115+
g[k][k] = 0
116+
for i in range(n):
117+
for j in range(n):
118+
# g[i][j] = min(g[i][j], g[i][k] + g[k][j])
119+
if g[i][k] + g[k][j] < g[i][j]:
120+
g[i][j] = g[i][k] + g[k][j]
121+
if all(
122+
g[i][j] <= maxDistance
123+
for i in range(n)
124+
for j in range(n)
125+
if mask >> i & 1 and mask >> j & 1
126+
):
127+
ans += 1
128+
return ans
97129
```
98130

99131
### **Java**
100132

101133
<!-- 这里可写当前语言的特殊实现逻辑 -->
102134

103135
```java
104-
136+
class Solution {
137+
public int numberOfSets(int n, int maxDistance, int[][] roads) {
138+
int ans = 0;
139+
for (int mask = 0; mask < 1 << n; ++mask) {
140+
int[][] g = new int[n][n];
141+
for (var e : g) {
142+
Arrays.fill(e, 1 << 29);
143+
}
144+
for (var e : roads) {
145+
int u = e[0], v = e[1], w = e[2];
146+
if ((mask >> u & 1) == 1 && (mask >> v & 1) == 1) {
147+
g[u][v] = Math.min(g[u][v], w);
148+
g[v][u] = Math.min(g[v][u], w);
149+
}
150+
}
151+
for (int k = 0; k < n; ++k) {
152+
if ((mask >> k & 1) == 1) {
153+
g[k][k] = 0;
154+
for (int i = 0; i < n; ++i) {
155+
for (int j = 0; j < n; ++j) {
156+
g[i][j] = Math.min(g[i][j], g[i][k] + g[k][j]);
157+
}
158+
}
159+
}
160+
}
161+
int ok = 1;
162+
for (int i = 0; i < n && ok == 1; ++i) {
163+
for (int j = 0; j < n && ok == 1; ++j) {
164+
if ((mask >> i & 1) == 1 && (mask >> j & 1) == 1) {
165+
if (g[i][j] > maxDistance) {
166+
ok = 0;
167+
}
168+
}
169+
}
170+
}
171+
ans += ok;
172+
}
173+
return ans;
174+
}
175+
}
105176
```
106177

107178
### **C++**
108179

109180
```cpp
110-
181+
class Solution {
182+
public:
183+
int numberOfSets(int n, int maxDistance, vector<vector<int>>& roads) {
184+
int ans = 0;
185+
for (int mask = 0; mask < 1 << n; ++mask) {
186+
int g[n][n];
187+
memset(g, 0x3f, sizeof(g));
188+
for (auto& e : roads) {
189+
int u = e[0], v = e[1], w = e[2];
190+
if ((mask >> u & 1) & (mask >> v & 1)) {
191+
g[u][v] = min(g[u][v], w);
192+
g[v][u] = min(g[v][u], w);
193+
}
194+
}
195+
for (int k = 0; k < n; ++k) {
196+
if (mask >> k & 1) {
197+
g[k][k] = 0;
198+
for (int i = 0; i < n; ++i) {
199+
for (int j = 0; j < n; ++j) {
200+
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
201+
}
202+
}
203+
}
204+
}
205+
int ok = 1;
206+
for (int i = 0; i < n && ok == 1; ++i) {
207+
for (int j = 0; j < n && ok == 1; ++j) {
208+
if ((mask >> i & 1) & (mask >> j & 1) && g[i][j] > maxDistance) {
209+
ok = 0;
210+
}
211+
}
212+
}
213+
ans += ok;
214+
}
215+
return ans;
216+
}
217+
};
111218
```
112219
113220
### **Go**
114221
115222
```go
223+
func numberOfSets(n int, maxDistance int, roads [][]int) (ans int) {
224+
for mask := 0; mask < 1<<n; mask++ {
225+
g := make([][]int, n)
226+
for i := range g {
227+
g[i] = make([]int, n)
228+
for j := range g[i] {
229+
g[i][j] = 1 << 29
230+
}
231+
}
232+
for _, e := range roads {
233+
u, v, w := e[0], e[1], e[2]
234+
if mask>>u&1 == 1 && mask>>v&1 == 1 {
235+
g[u][v] = min(g[u][v], w)
236+
g[v][u] = min(g[v][u], w)
237+
}
238+
}
239+
for k := 0; k < n; k++ {
240+
if mask>>k&1 == 1 {
241+
g[k][k] = 0
242+
for i := 0; i < n; i++ {
243+
for j := 0; j < n; j++ {
244+
g[i][j] = min(g[i][j], g[i][k]+g[k][j])
245+
}
246+
}
247+
}
248+
}
249+
ok := 1
250+
for i := 0; i < n && ok == 1; i++ {
251+
for j := 0; j < n && ok == 1; j++ {
252+
if mask>>i&1 == 1 && mask>>j&1 == 1 && g[i][j] > maxDistance {
253+
ok = 0
254+
}
255+
}
256+
}
257+
ans += ok
258+
}
259+
return
260+
}
261+
```
116262

263+
### **TypeScript**
264+
265+
```ts
266+
function numberOfSets(n: number, maxDistance: number, roads: number[][]): number {
267+
let ans = 0;
268+
for (let mask = 0; mask < 1 << n; ++mask) {
269+
const g: number[][] = Array.from({ length: n }, () => Array(n).fill(Infinity));
270+
for (const [u, v, w] of roads) {
271+
if ((mask >> u) & 1 && (mask >> v) & 1) {
272+
g[u][v] = Math.min(g[u][v], w);
273+
g[v][u] = Math.min(g[v][u], w);
274+
}
275+
}
276+
for (let k = 0; k < n; ++k) {
277+
if ((mask >> k) & 1) {
278+
g[k][k] = 0;
279+
for (let i = 0; i < n; ++i) {
280+
for (let j = 0; j < n; ++j) {
281+
g[i][j] = Math.min(g[i][j], g[i][k] + g[k][j]);
282+
}
283+
}
284+
}
285+
}
286+
let ok = 1;
287+
for (let i = 0; i < n && ok; ++i) {
288+
for (let j = 0; j < n && ok; ++j) {
289+
if ((mask >> i) & 1 && (mask >> j) & 1 && g[i][j] > maxDistance) {
290+
ok = 0;
291+
}
292+
}
293+
}
294+
ans += ok;
295+
}
296+
return ans;
297+
}
117298
```
118299

119300
### **...**

0 commit comments

Comments
 (0)