您的位置:首页 > 其它

SDUT 3808 离散题目14

2017-05-24 09:32 246 查看
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

代码:判断是不是对称

#include<bits/stdc++.h>
using namespace std;
struct node
{
int x, y;
};
node a[1000005];
bool cmp(node t, node t1)
{
if(t.x == t1.x) return t.y < t1.y;
else return t.x < t1.x;
}
int main()
{
int n, m, i;
while(~scanf("%d %d", &n, &m))
{
for(i = 0; i < m; i++)
{
scanf("%d %d", &a[i].x, &a[i].y);
if(a[i].x > a[i].y) swap(a[i].x, a[i].y);
}
sort(a, a + m, cmp);//排好序,x相同按y从小到大,否则x从小到大
for(i = 0; i < m; i++)
{
if(a[i].x == a[i].y) continue;//对称,继续
else
{
if(i != m - 1) {
if(a[i].x != a[i + 1].x || a[i].y != a[i + 1].y)
{
break;//不是对称
}
else//是对称
{
i++;}
}
else
{
break;
}
}
}
if(i != m) printf("NO\n");
else printf("YES\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: