CF 1169B:Pairs
题意:
给你m个点对,然后问你能不能找到两个不同的值,使得每个每个点对在都至少含有这两个点对中的一个
思路:
枚举第一个点对中的两个值,判断剩余的点对中不包含这个第一个点对的两个值的有多少个,如果有0个的话,就说明这些点对至少有一个相等了,所以就肯定输出YES.如果不是的话,我们就判断剩余的点对中出现次数最多的为多少次,如果数总的对数中不包含x的第一个值的个数,那么也是yes。对于第一个点对的第二个用同样的方法处理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e5+5;
int k,n,m,p[maxn],p2[maxn],f[maxn],f2[maxn],mx,mx2;
struct node{
int x,y;
}a[maxn];
int main(){
scanf("%d%d",&n,&m);
int x,y,m1=0,m2=0;
for(int i=1;i<=m;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
int a1=a[1].x,he=0;
for(int i=2;i<=m;i++){
if(a[i].x!=a1&&a[i].y!=a1)
f[i]=1,he++;
}
if(he==0){
printf("YES\n");
return 0;
}
for(int i=2;i<=m;i++){
if(f[i]){
p[a[i].x]++,p[a[i].y]++;
mx=max(mx,max(p[a[i].x],p[a[i].y]));
}
}
if(mx==he){
printf("YES\n");
return 0;
}
int a2=a[1].y,he2=0;
for(int i=2;i<=m;i++){
if(a[i].x!=a2&&a[i].y!=a2)
f2[i]=1,he2++;
}
if(he2==0){
printf("YES\n");
return 0;
}
for(int i=2;i<=m;i++){
if(f2[i]){
p2[a[i].x]++,p2[a[i].y]++;
mx2=max(mx2,max(p2[a[i].x],p2[a[i].y]));
}
}
if(mx2==he2){
printf("YES\n");
return 0;
}
printf("NO\n");
}