1. 程式人生 > >Codeforces Round #488 by NEAR (Div. 2)D. Open Communication

Codeforces Round #488 by NEAR (Div. 2)D. Open Communication

題目連結:

題目大意:有兩個參選者。第一行兩個數字n,m。代表第一個參選者有n對數字,第二個參選者有m對數字。

每一對兩個數字有要求:即每一對的兩個數字均是不一樣的,且同一個參選者不可能擁有兩對相同的數字對

現在他們進行一個匹配推測數字,即參選者1中的一對數字a,b和參選者2中一對數字c,d,滿足其中一個數字相同,另一個數字不同則說明他們之間的公共數字是那個相同的數字。如果這對數字中的兩個數字都相同的話,不成立,直接跳過這一對。現在就是讓我們判斷我們能否推斷出他們的公共數字,以及他們自己能否推斷出那個公共數字。

都不能推斷出則輸出-1,都能則輸出那個公共數字,我們不能他們參選者能的話輸出0

思路:

1.參選者1中的每一對數字,對參選者2的每一對進行遍歷匹配,判斷這一對數字能否找出公共數字,以及判斷找出的公共數字是否相同。如果對應參選者1中的每一對數字能夠找出一對,那麼這對數字是可以被我們推測出來的,如果有多個公共數字,那麼我們是不可以推測出來的。

2.對參選者2進行1中的操作

3.最後進行一個判斷,如果有一對數字他的公共數字有多個,則輸出-1

如果有多對數字,他們每一對都有一個公共數字,且這些公共數字至少有兩個是不一樣的,這樣我們不知道,但參選者知道

如果只有一對數字有公共數字,或者有多對數字,他們每一對都有一個公共數字,但這些公共數字是一樣的,那麼我們和參選者都知道

AC程式碼如下:

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-10;
const int maxn=1000+10;
struct node
{
    int u,v;
}a[maxn],b[maxn];
int c;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        cin>>a[i].u>>a[i].v;
    }
    for(int i=0;i<m;i++)
    {
        cin>>b[i].u>>b[i].v;
    }
    c=-1;
    int ans=1;
    for(int i=0;i<n;i++)
    {
        int first=0,second=0;
        for(int j=0;j<m;j++)
        {
            if(min(a[i].v,a[i].u)==min(b[j].v,b[j].u)&&max(a[i].v,a[i].u)==max(b[j].v,b[j].u))continue;
            if(a[i].u==b[j].u||a[i].u==b[j].v)first++;
            if(a[i].v==b[j].u||a[i].v==b[j].v)second++;
        }
        if(first>0&&second>0)
        {
            ans=-1;
            break;
        }
        else if(ans==1&&(first>0||second>0))
        {
            if(c==-1)
            {
                if(first>0)c=a[i].u;
                else if(second>0)c=a[i].v;
            }
            else
            {
                if(first>0&&c!=a[i].u)ans=0;
                else if(second>0&&c!=a[i].v)ans=0;
            }
        }
    }
    for(int i=0;i<m;i++)
    {
        int first=0,second=0;
        for(int j=0;j<n;j++)
        {
            if(min(a[j].v,a[j].u)==min(b[i].v,b[i].u)&&max(a[j].v,a[j].u)==max(b[i].v,b[i].u))continue;
            if(b[i].u==a[j].u||b[i].u==a[j].v)first++;
            if(b[i].v==a[j].u||b[i].v==a[j].v)second++;
        }
        if(first>0&&second>0)
        {
            ans=-1;
            break;
        }
        else if(ans==1&&(first>0||second>0))
        {
            if(c==-1)
            {
                if(first>0)c=b[i].u;
                else if(second>0)c=b[i].v;
            }
            else
            {
                if(first>0&&c!=b[i].u)ans=0;
                else if(second>0&&c!=b[i].v)ans=0;
            }
        }
    }
    if(ans>0)printf("%d\n",c);
    else printf("%d\n",ans);
    return 0;
}