离散题目14
Time Limit: 1000MS
Memory Limit: 65536KB
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一定成立
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
****************************************************/