二元关系的复合运算----离散数学编程实训(Educoder)

R和S是A上的关系,求RοS,输入的第一行是A中元素的个数n、R中序偶的个数m、S中序偶的个数h,接下来的m行对应R中的序偶,每行对应一个序偶,再接下来的h行对应S中的序偶,每行对应一个序偶。输出RοS中序偶的个数。1≤n≤5000, 0≤m≤10000,0≤h≤10000。 样例: 输入: 5 3 2 1 2 1 1 3 5 1 4 5 3 输出: 2 输入说明:第一行5 3 2表示A中有1到5这5个元素,R中有3个序偶,对应第2行到第4行,S中有2个序偶,对应第5行到第6行,R={<1,2>,<1,1>,<3,5>}, S={<1,4>,<5,3>} 输出说明:RοS={<1,4>,<3,3>},RοS中有2个序偶,所以输出2。

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int main() {
    int n, m, h;
    cin >> n >> m >> h;

    // 构建R和S的邻接表
    vector<vector<int>> adjR(n+1); // R的邻接表
    vector<vector<int>> adjS(n+1); // S的邻接表

    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        adjR[u].push_back(v);
    }

    for (int i = 0; i < h; i++) {
        int u, v;
        cin >> u >> v;
        adjS[u].push_back(v);
    }

    // 计算RοS
    unordered_set<int> res; // 存放RοS中的元素
    for (int i = 1; i <= n; i++) {
        for (int v : adjR[i]) {
            for (int w : adjS[v]) {
                res.insert(i * 10000 + w); // 将序偶存放到哈希表中
            }
        }
    }

    cout << res.size() << endl; // 输出答案

    return 0;
}

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值