编程题练习@9-13

题目一:

互通设备集
题目描述:
同一局域网内的设备可以相互发现,具备直连路由的两个设备可以互通。假定设备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 输出
格式为:建造的基站个数+空格+覆盖的地域面积

样例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)

你可能感兴趣的:(python,深度优先,算法,数据结构)