离散题目10 判断满射

来源:互联网 发布:java 哈希表 编辑:程序博客网 时间:2024/06/06 23:52

Problem Description

给定一个数学函数F和两个集合A,B,写一个程序来确定函数是满射。 如果每个可能的像至少有一个变量映射其上(即像集合B中的每个元素在A中都有一个或一个以上的原像),或者说值域任何元素都有至少有一个变量与之对应,那这个映射就叫做满射。

Input

多组输入直到文件结束,对于每组输入,第一行先输入一个n(A集合里的元素个数),m(B集合里的元素个数),k(F数学函数关系的条数)。

0 < n,m < 10000, 0 < k < n;

第二行输入有n个元素,分别为a1到an;

第三行输入有m个元素,分别为b1到bn;

接下来输入有k行,分别为集合A到B的关系

Output

(一组答案占一行)

当满足满射关系时输出Yes。

不满足关系时输出No。

Example Input

5 3 5
1 3 5 7 8
2 5 6
1 2
3 6
5 5
7 2
8 6

Example Output

Yes
代码如下

#include<stdio.h>int main(){    int n , m ,k,i, j,num,flat,flag ;    int a[10010],b[10010];    int c[10010],d[10010];    while(scanf("%d %d %d",&n,&m,&k)!=EOF)    {        for(i = 0;i<n;i++)            scanf("%d",&a[i]);        for(j = 0;j<m;j++)            scanf("%d",&b[j]);        for(i = 0;i<k;i++)            scanf("%d %d",&c[i],&d[i]);            num = 0 ; flag = 0;        for(i = 0;i<m;i++)        {            for(j = 0;j<k;j++)            {                if(b[i]==d[j])                {                    num++;                    break;                }            }        }        if(num==m)            flag = 1;        num = 0;flat = 0;        for(i = 0;i<n;i++)        {            for(j = 0;j<k;j++)            {                if(a[i]==c[j])                {                    num++;                    break;                }            }        }        if(num<n||num==n)            flat = 1;        if(flag&&flat)            printf("Yes\n");        else printf("No\n");    }    return 0;}
原创粉丝点击