离散题目11
Time Limit: 1000MS
Memory Limit: 65536KB
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
Author
Stone
双射,即同时满足满射和单射,可综合前两道题的代码得到双射判断代码
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n,k;
int a[10010];
int b[10010];
int c[10010];
int d[10010];
while(cin>>m>>n>>k)
{
int x,y;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(int i = 0; i <m; i++)
{
cin>>x;
a[x] = 1;
c[i] = x;
}
for(int i =0; i < n; i++)
{
cin>>x;
b[x] = 1;
d[i] = x;
}
for(int i = 0; i < k; i++)
{
cin>>x>>y;//累计元素出现次数
b[y]++;
a[x]++;
}
int flag = 0;
for(int i = 0; i < m; i++)
{
if(a[c[i]] > 2)//如果A元素出现次数超过一次,即不满足单射条件
{
flag = 1;
break;
}
}
for(int i = 0; i < n; i++)
{
if(b[d[i]] < 2)//如果B元素有某元素未出现过,不满足满射关系
{
flag = 1;
break;
}
}
if(flag)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}