为什么子网划分时最大可指派网络数要减去2

假设我们有一个网络:192.168.0.0/24,我们现在需要2个子网,那么按照去掉全0和全1的子网,应该使用/26而不是/25,得到两个可以使用的子网192.168.0.64和192.168.0.128
对于192.168.0.0/24,网络地址是192.168.0.0,广播地址是192.168.0.255
对于192.168.0.0/26,网络地址是192.168.0.0,广播地址是192.168.0.63
对于192.168.0.64/26,网络地址是192.168.0.64,广播地址是192.168.0.127
对于192.168.0.128/26,网络地址是192.168.0.128,广播地址是192.168.0.191
对于192.168.0.192/26,网络地址是192.168.0.192,广播地址是192.168.0.255

你可以看出来,对于第一个子网,网络地址和主网络的网络地址是重叠的,对于最后一个子网,广播地址和主网络的广播地址也是重叠的。这样的重叠将导致极大的混乱。比如,一个发往192.168.0.255的广播是发给主网络的还是子网的?这就是为什么在当时不建议使用全0和全1子网。

因为传统路由器收到的IP地址不带掩码,所以和主网的地址重叠后不能区分,就不用这两个子网地址。而目前用的CIDR就会把网络前缀带上,就相当于带上了子网掩码。就不用再减2了,全0和全1的子网也能用。

参考1
参考2

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
工作指派问题可以使用网络流算法求解最大权匹配,具体步骤如下: 1. 构建一个源点和汇点,源点向所有工人连边,所有工作向汇点连边。 2. 对于每个工人和每个工作,连一条边,容量为1,表示该工人可以胜任该工作。 3. 对于每个工人之间和每个工作之间,连一条容量为正无穷的边,表示可以任意调配。 4. 运行最大流算法,得到最大权匹配。 下面是一个简单的 Python 实现: ``` from collections import defaultdict class MaxFlow: def __init__(self, n): self.n = n self.adj = defaultdict(list) self.cap = defaultdict(int) self.flow = defaultdict(int) self.level = defaultdict(int) def add_edge(self, u, v, c): self.adj[u].append(v) self.adj[v].append(u) self.cap[(u, v)] += c def bfs(self, s, t): self.level.clear() q = [s] self.level[s] = 1 while q: u = q.pop(0) for v in self.adj[u]: if self.cap[(u, v)] > self.flow[(u, v)] and not self.level[v]: self.level[v] = self.level[u] + 1 q.append(v) return bool(self.level[t]) def dfs(self, u, t, f): if u == t: return f for v in self.adj[u]: if self.cap[(u, v)] > self.flow[(u, v)] and self.level[v] == self.level[u] + 1: d = self.dfs(v, t, min(f, self.cap[(u, v)] - self.flow[(u, v)])) if d > 0: self.flow[(u, v)] += d self.flow[(v, u)] -= d return d return 0 def max_flow(self, s, t): res = 0 while self.bfs(s, t): while True: f = self.dfs(s, t, float('inf')) if f == 0: break res += f return res def solve(n, m, a): s = 0 t = n + m + 1 mf = MaxFlow(t + 1) for i in range(1, n + 1): mf.add_edge(s, i, 1) for i in range(1, m + 1): mf.add_edge(i + n, t, 1) for i in range(1, n + 1): for j in range(1, m + 1): if a[i - 1][j - 1]: mf.add_edge(i, j + n, 1) return mf.max_flow(s, t) n = 3 m = 3 a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]] print(solve(n, m, a)) # 输出 3 ``` 其中,`MaxFlow` 类实现了最大流算法,`solve` 函接受一个二维矩阵 `a` 表示工人和工作之间的关系,返回最大匹配

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzukomorebi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值