Codeforces Round #562 (Div. 2) Pairs

题意: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; 
}
View Code

猜你喜欢

转载自www.cnblogs.com/lin1874/p/10941020.html
今日推荐