当前位置: 代码迷 >> 综合 >> Codeforces Round #562 (Div. 2) B. Pairs(思维)
  详细解决方案

Codeforces Round #562 (Div. 2) B. Pairs(思维)

热度:44   发布时间:2023-12-26 09:38:18.0

B. Pairs

【题意】

给出 n (所有出现的数字范围在1...n),有 m 组数对,每组为(a, b)

问是否存在x,y 使得对于每组数至少有一个是 xy

【分析】

因为看了下tags,写着 graphs,所以我就往图上想了想...  然后想用领接表来着,但是...很显然会超时嘛

但是还没 T 就先 wa 了,可能哪里没处理好吧

THEN....

这是道思维题~ 

首先,如果存在这样的 xy 的话,那么对于第一组数对中,必然有一个是 y

记第一组数对为 x1,y1 ,第二组 x2,y2 (x1、x2、y1、y2互不相等)

那么就是有5种可能(x1, y1)(x1, x2)(x1, y2)(y1, x2)(y1, y2)

如果存在的话,必然是上面5种中的一种

所以判断一下就好啦

【代码】

#include<bits/stdc++.h>
using namespace std;const int maxn=3e5+10;
struct node{int a,b;
}num[maxn];
int n,m;bool check(int x,int y)
{for(int i=1;i<=m;++i)if(num[i].a!=x && num[i].b!=y && num[i].b!=x && num[i].a!=y)return false;return true;
}
int main()
{scanf("%d%d",&n,&m);int x1,y1,x2,y2,f=0;for(int i=1;i<=m;++i){scanf("%d%d",&num[i].a,&num[i].b);if(i==1)x1=num[1].a,y1=num[1].b;else {if(!f && num[i].a!=x1 && num[i].a!=y1 && num[i].b!=x1 && num[i].b!=y1)x2=num[i].a,y2=num[i].b,f=1;}}if(check(x1,y1) || check(x1,x2) || check(x1,y2) || check(y1,x2) || check(y1,y2))puts("YES");else puts("NO");return 0;
}

 

  相关解决方案