题目一:
互通设备集
题目描述:
同一局域网内的设备可以相互发现,具备直连路由的两个设备可以互通。假定设备A和B互通,B和C互通,那么可以将B作为中心设备,通过多跳路由策略使设备A和C互通。这样,A、B、C三个设备就组成了一个互通设备集。其中,互通设备集包括以下几种情况:
1)直接互通的多个设备
2)通过多跳路由策略间接互通的多个设备
3)没有任何互通关系的单个设备
现给出某一局域网内的设备总数以及具备直接互通关系的设备,请计算该局域网内的互通设备集有多少个?
样例1:
输入:
3
2
0 1
0 2
输出:
1
样例2
输入
2
0
输出
2
样例3
输入
5
2
0 1
2 3
输出
3
代码如下:
m = int(input())
n = int(input())
edges = []
for _ in range(n):
edges.append(tuple(map(int, input().split())))
# 深搜
def dfs(graph, start, visited):
visited[start] = True
for neighbor in graph[start]:
if not visited[neighbor]:
dfs(graph, neighbor, visited)
# 创建邻接表
def create_graph(m, edges):
graph = [[] for _ in range(m)]
for edge in edges:
graph[edge[0]].append(edge[1])
graph[edge[1]].append(edge[0])
return graph
# 记录连通分量数
def dfs_graph(m, edges):
graph = create_graph(m, edges)
cnt = 0
visited = [False] * m
for i in range(m):
if not visited[i]:
dfs(graph, i, visited)
cnt += 1
print(cnt)
dfs_graph(m, edges)
题目2:
基站建设
题目描述:
运营商建设基站时需要关注很多因素,其中:基站的信号覆盖范围、建设成本就是要考虑的部分因素。
以一个二维数组(1000010000)表示需要服务的有效地域范围,假设个基站坐标为(2,2),可覆盖的范围为基站为中心的33的矩阵(若不在有效地域范围则无效)。
现有多个基站候选点,我们需要决策在哪些地点建设基站,要求:在尽可能多地覆盖服务地域的前提下尽可能少地建设基站。
输入
第一行为候选基站的坐标点个数n (0<n<10000),后面的每一行都表示候选基站的行列位置,格式为:行位置+空格+列位置
输出
格式为:建造的基站个数+空格+覆盖的地域面积
样例1
输入
4
2 2
5 5
5 4
5 3
输出
3 24
解释
最佳的策略为选择(2,2)、(5,5)、(5,3)这三个基站候选点,他们的覆盖面积为24
代码如下:
# 计算基站覆盖面积
def calculate_coverage(candidate_sites):
used = set()
covered_area = 0
for site in candidate_sites:
row, col = site
for i in range(row-1, row+2):
for j in range(col-1, col+2):
if (i >= 0 and i < 10000 and j >= 0 and j < 10000):
if (i, j) not in used:
used.add((i, j))
covered_area += 1
return covered_area
# 逐个减去基站计算面积
def choose_sites(candidate_sites, covered_area):
for site in candidate_sites:
temp_sites = candidate_sites.copy()
temp_sites.remove(site) # 逐个减去一个候选基站
temp_covered_area = calculate_coverage(temp_sites)
if temp_covered_area == covered_area:
candidate_sites = temp_sites # 更新选择的基站列表
return candidate_sites
# 从输入读取候选基站信息
n = int(input())
candidate_sites = set() # 使用集合来避免重复的基站坐标
for _ in range(n):
x, y = map(int, input().split())
candidate_sites.add((x, y))
# 初始时选择所有候选基站并计算覆盖面积
covered_area = calculate_coverage(candidate_sites)
# 选择基站并计算覆盖面积
chosen_sites = choose_sites(candidate_sites, covered_area)
final_covered_area = calculate_coverage(chosen_sites)
# 输出结果
print(len(chosen_sites), final_covered_area)