离散题目12

来源:互联网 发布:台湾问题 知乎 编辑:程序博客网 时间:2024/06/05 00:11

离散题目12

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

给出两个集合,以及两个集合上的关系。判断该关系能不能构成函数 

Input

多组输入。第一行数字表示集合A;第二行数字表示集合B;第三行一个数字N,表示关系的个数。以下N行,每行两个数字a b,用来描述关系a→b。0 < n < = 20000,集合A、B的大小不超过10000.

Output

每组数据输出一行,所给关系属于函数,输出’yes’ ,否则输出‘no’。 

Example Input

1 2 34 5 631 42 53 61 2 34 5 631 41 51 6

Example Output

yesno

Hint

Author


通过示例数据能够看出,题意即为验证是否出现了一对多的情况,出现即为错误,难点在于不定长数组的输入;


以下为AC代码(一开始总是出现超时问题+_+,后来参考了校友BlessingXRY的博客,感谢)


#include <iostream>#include<bits/stdc++.h>using namespace std;string aa,bb, cc;int t;set<int>s1,s2;bool Input()//不定长数组的输入{    s1.clear(), s2.clear();    if(!getline(cin,aa))//输入        return false;    stringstream ss(aa);//拆分为整数    while(ss>>t)    {        s1.insert(t);//存入到集合s1中,下同    }    getline(cin,bb);    stringstream dd(bb);    while(dd >> t)    {        s2.insert(t);    }    return true;}//int a[20010];//一开始想用数组代替map,但是数组的缺点在于不论初始化为0还是其他数值,都可以存在数据中//也有此数值的情况,可能是我功力还不够,现在还没找到方法int main(){    while(Input())    {        //memset(a,0,sizeof(a));        int n;        cin>>n;        int x,y;        map<int,int>m;        bool flag = true;        for(int i = 0; i < n; i++)        {            cin>>x>>y;//叙述关系            if(s1.count(x) &&s2.count(y))//判断x,y确定为集合AB中的元素            {                if(m.count(x) != 0 && m[x] != y)//如果曾在叙述中出现过x并且x对应的数值与上一次不一样                {                    flag = false;                }                else                    m[x] = y;            }            else                flag = false;        }        if(flag)            cout<<"yes"<<endl;        else            cout<<"no"<<endl;        getline(cin,cc);//超时原因,测试数据最后一行可能有一行无用字符串,或者是百度说的两个getline()//不能同时使用??用一个getline吃掉    }    return 0;}




原创粉丝点击