您的位置:首页 > 其它

离散题目14

2017-05-17 09:45 274 查看


离散题目14

Time Limit: 1000MS Memory Limit: 65536KB

Submit Statistic


Problem Description

判断集合是不是对称的。


Input

首先输入两个数n,m表示集合中元素的个数,以及存在的关系数。
接下来1行包含n个以空格分隔的整数。
接下来m行,每行包含两个数a,b表示关系。
(1< = n < = 1000,1 < = a,b < = n,m < = n*(n-1)&& m < = 1000)


Output

对于每组输入,如果这个集合是对称的则输出“YES”,否则输出“NO”。(均不包含引号)


Example Input

5 8
1 1
1 2
2 1
3 3
2 3
3 2
4 5
5 4
5 9
1 1
1 2
2 1
3 3
2 3
3 2
4 5
5 4
5 1



Example Output

YES
NO



Hint


Author

UMR

point:for循环,谨防超时。

a,b是属于集合的元素,R是关系,则有:

1自反性---即对集合中的每一个元素a都有aRa

2对称性---即对集合中的任意元素aRb,aRb成立当且仅当bRa成立

3传递性---即对集合中的任意元素abc若aRb和bRc成立则aRc一定成立

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
int m,n;
int x,y;
while(cin>>m>>n)
{
int flag = 1;
int a[1001][1001];
memset(a,0,sizeof(a));
set<int>v1,v2;
set<int>::iterator it1,it2;
v1.clear();
v2.clear();

while(n--)
{
cin>>x>>y;
a[x][y] = 1;
v1.insert(x);//由于是非连续集合,为了不浪费多余时间,存储x,y,方便下面作比较时直接调用
v2.insert(y);
}

for(it1 = v1.begin(); it1 != v1.end(); it1++)
for(it2 = v2.begin(); it2 != v2.end(); it2++)
{
if(a[*it1][*it2] != a[*it2][*it1])//因为在所设定01矩阵中,对称即相等,不对称即不相等,十分清晰的判断思路
{
flag = 0;
break;
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}

/***************************************************
User name:
Result: Accepted
Take time: 112ms
****************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STL 离散