📌  相关文章
📜  国际空间研究组织 | ISRO CS 2008 |问题 73(1)

📅  最后修改于: 2023-12-03 15:37:14.070000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2008 |问题 73

问题描述

对于两个由一组点表示的插入边的有向图,其中第一个图中的边按任意顺序插入,而第二个图中的边按第二个图中的顺序插入。在从这两个图中删除相同的边之后,在第二个图中剩余的边数为多少?

例如,考虑两个由顶点 1-5 和边 {[1, 2], [2, 3], [3, 4], [4, 5], [5, 1]} 组成的图。对于第一个图,边 [1, 2] 和 [2, 3] 可以交换,得到另一组插入的边。但是,对于第二个图,不能使用任何方法来重新安排插入的边。在两个图中删除相同的边之后,第二个图中将剩余 3 条边。

输入格式
  • 第一行包含一个整数 T,表示测试用例的数量。
  • 对于每个测试用例,第一行包含整数 N 和 M 分别表示第一个图中的点和边数。
  • 接下来 M 行每行包含一对整数 xi 和 yi,表示第一个图中的边。
  • 接下来一行包含整数 K,表示第二个图中的边数。
  • 接下来 K 行每行包含一对整数 xi 和 yi,表示第二个图中的边。
输出格式

对于每个测试用例,输出一个整数表示第二个图中删除相同边之后剩余的边数。

样例输入
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实现。