Problem Description
给定一个数学函数写一个程序来确定该函数是否是双射的
Input
多组输入。 第一行输入三个整数n,m,k,分别表示集合a中的元素个数,集合b中的元素个数,集合a到b的映射个数。 第二行输入n个数,代表集合a中的元素。 第三行输入m个数,代表集合b中的元素。接下来k行,每行两个数,代表集合a中的元素x和x在集合b中的像y。
Output
每组数据输出一行,若F为a到b的双射,输出”YES”, 否则输出”NO”。
Example Input
5 5 5
1 2 3 7 8
2 5 6 9 0
1 9
3 2
2 6
7 0
8 5
Example Output
YES
Hint
保证集合a中元素无重复,集合b中元素无重复,映射关系无重复(如:{,})
1<=n,m,k<=1000
1<=a[i], b[i]<=10000
x∈a, y∈b
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m, k, i, j, num;
set<int> a, b;
while(~scanf("%d %d %d", &n, &m, &k))
{
int flag = 0;
if(n != m || n != k || m != k) flag = 1;//无法满足双射
for(i = 0; i < n; i++)//集合a
{
scanf("%d", &num);
a.insert(num);
}
for(j = 0; j < m; j++)//集合b
{
scanf("%d", &num);
b.insert(num);
}
int x, y;
while(k--)
{
scanf("%d %d", &x, &y);
if(a.count(x) && b.count(y))//元素都在集合里面,删除掉
{
a.erase(x);
b.erase(y);
}
else flag = 1;//不满足双射
}
if(flag) printf("NO\n");
else printf("YES\n");
a.clear(), b.clear();
}
}

本文介绍了一个程序设计问题,即如何通过编程判断一个从集合A到集合B的数学函数是否为双射函数。输入包括集合A和B的大小及映射数量,以及具体的映射关系。通过C++实现,利用set容器进行元素唯一性检查,确保函数满足双射条件。
17万+

被折叠的 条评论
为什么被折叠?



