B. Pairs
【题意】
给出 n (所有出现的数字范围在1...n),有 m 组数对,每组为(a, b)
问是否存在x,y 使得对于每组数至少有一个是 x 或 y
【分析】
因为看了下tags,写着 graphs,所以我就往图上想了想... 然后想用领接表来着,但是...很显然会超时嘛
但是还没 T 就先 wa 了,可能哪里没处理好吧
THEN....
这是道思维题~
首先,如果存在这样的 x 和 y 的话,那么对于第一组数对中,必然有一个是 x 或 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;
}