题意:n个数,m组x0,y0。问是否存在两个数x,y使得每个组都至少含有这两个数;
思路,每个组都至少含有这两个数,可以假设第一组中第一个数是x,然后用vis标记哪些组不含有x,在不含有x的组中,选择一组找y,如果满足题意,则yes,否则x就为第一组的第二个数,然后找y,如歌满足题意,yes,否则no;
自己写的有点复杂,可能用vector会更简洁一些.....
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> P; const int maxn=300000+10; P s[maxn]; int n,m; bool vis[maxn]; int x; bool check() { for(int i=0;i<m;i++) { if(vis[i]==false) return false; } return true; } bool solve(int count) { int y=s[count].first; for(int i=1;i<m;i++) { if(vis[i]) continue; if(s[i].first==y||s[i].second==y) { vis[i]=true; } } if(check()) { return true; } for(int i=1;i<m;i++) { if(s[i].first==x||s[i].second==x) continue; if(s[i].first==y||s[i].second==y) { vis[i]=false; } } y=s[count].second; for(int i=1;i<m;i++) { if(vis[i]) continue; if(s[i].first==y||s[i].second==y) { vis[i]=true; continue; } } if(check()) { return true; } else { return false; } } int main() { cin>>n>>m; for(int i=0;i<m;i++) { cin>>s[i].first>>s[i].second; } int flag=0; //标记答案 for(int i=0;i<m;i++) //初始全false vis[i]=false; x=s[0].first; vis[0]=true; //第一组一定为真 int count=-1; //标记未vis为false的第一组位置 for(int i=1;i<m;i++) { if(s[i].first==x||s[i].second==x) { vis[i]=true; continue; } if(count==-1) count=i; } if(check()||solve(count)) //检查s[i].frist +(s[count].frist or s[count].second) { flag=1; } else //检查s[i].second +(s[count].frist or s[count].second) { for(int i=0;i<m;i++) vis[i]=false; x=s[0].second; vis[0]=true; count=-1; for(int i=1;i<m;i++) { if(s[i].first==x||s[i].second==x) { vis[i]=true; continue; } if(count==-1) count=i; } if(check()||solve(count)) { flag=1; } } if(flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }