📅  最后修改于: 2023-12-03 15:37:14.070000             🧑  作者: Mango
对于两个由一组点表示的插入边的有向图,其中第一个图中的边按任意顺序插入,而第二个图中的边按第二个图中的顺序插入。在从这两个图中删除相同的边之后,在第二个图中剩余的边数为多少?
例如,考虑两个由顶点 1-5 和边 {[1, 2], [2, 3], [3, 4], [4, 5], [5, 1]} 组成的图。对于第一个图,边 [1, 2] 和 [2, 3] 可以交换,得到另一组插入的边。但是,对于第二个图,不能使用任何方法来重新安排插入的边。在两个图中删除相同的边之后,第二个图中将剩余 3 条边。
对于每个测试用例,输出一个整数表示第二个图中删除相同边之后剩余的边数。
2
5 5
1 2
2 3
3 4
4 5
5 1
5
1 2
2 3
3 4
4 5
5 1
5 5
1 2
2 3
3 4
4 5
5 1
5
1 5
5 4
4 3
3 2
2 1
3
0
我们可以先把第一个图中的边全部加进来,再一次往第二个图里插入边并判断是否是第一个图中出现过的边,如若是则从第一个图中删除该边,否则累计第二个图的边数。最后输出第二个图中剩余的边数即可。
def count_remaining_edges(edges1, edges2):
"""
计算两个有向图中删除相同的边后,第二个图中剩余的边数。
:param edges1: List[Tuple[int, int]],第一个图中的边列表。
:param edges2: List[Tuple[int, int]],第二个图中的边列表。
:return: int,第二个图中删除相同的边后剩余的边数。
"""
# 用集合存储第一个图的边,方便快速判断是否为相同的边
edges1_set = set(edges1)
# 初始化第二个图中删除相同边后的边数
remaining_edges = 0
for edge in edges2:
if edge in edges1_set:
# 如果在第一个图中存在该边,则删除第一个图中该边
edges1_set.discard(edge)
else:
# 否则统计第二个图中剩余的边数
remaining_edges += 1
return remaining_edges
返回的代码片段如上所示,均采用Python实现。