[codeforces741C]アルパの一晩のパーティーとMehrdadのサイレント入り

著作権:ハードコードワード、あなたが私に言うことを忘れないでください転載https://blog.csdn.net/dxyinme/article/details/90033800

テストあたりの制限時間:1秒
テストあたりのメモリ制限:256メガバイト

アルパの土地で女の子は本当に魅力的であることに注意してください。

アルパは一晩中パーティーを愛しています。これらの当事者の1の中央にMehrdadが突然現れました。彼は見た n n個 友人のペアがテーブルの周りに座って。 i 番目のペアは上に座って、少年から成って a i a_iを 番目の椅子、そして彼のガールフレンド、上に座って b i b_i 番目の椅子。椅子は、番号を付けました。 1 1 経由 2 n 2N 、時計回り方向です。各椅子に座って、正確に1人がありました。

KooftとZahre - 3月:食品の2種類がありました。:今Mehrdadは不思議、その結果、ゲストのための食糧を提供するためにどのような方法がありました

それぞれの人が食べ物の1つだけの型を持っていた、
いかなる少年は、彼のガールフレンドのような食品の同じ種類を持っていた
連続的な椅子に座って任意の3人のゲストの中に、食品の異なる種類を持っていた二人でした。その椅子に注意してください。 2 n 2N 及び 1 1 連続したと考えられています。

Mehrdadの質問に対する答えを見つけます。それが可能であった場合は、条件を満たした食品の種類のいくつかの配置を見つけます。
入力

最初の行は、整数が含ま n ( 1 n 1 0 5 ) N(1≤nは10 ^ 5≤) -ゲストのペアの数。

ザ・ i 次のn行目の整数の対を含ん a i a_iを そして b i ( 1 a i , b i 2 n ) b_i(1≤a_iを、b_i≤2N) -中の少年の椅子の数 i ペアが座っていたと彼のガールフレンドは、椅子の数を座っされた目。各椅子に座って、正確に1人があったことを保証しています。
出力

何の解決策、プリントが存在しない場合 1 -1

それ以外の場合は、印刷 n n個 ライン、 i 彼らの目のための食品の種類を表す2つの整数を含まなければなりません i ペアを番目。行の最初の整数は、少年が持っていた食品の一種であり、2番目の整数は、女の子が持っていた食べ物の種類です。誰かがKooftを持っていた場合、印刷 1 1 、そうでない場合は印刷 2 2

複数の解決策がある場合は、それらのいずれかを印刷します。

入力

3
1 4
2 5
3 6

出力

1 2
2 1
1 2

問題の意味:
与えられたN個の関係(AI、BI)は、(AI、BI)夫婦の関係で表される、結合3色に隣接することができない同じ色は、同じではない2×N 1と隣接していますA。あなたは、誰も染色(2色の合計)、染色プロトコルを求めてグループをしたいです。

ソリューション:
まず第一には、12121212を染色によると...そう、その後、夫婦の関係の状況が存在しない場合には確かに可能です。その後、それらの間のその後もエッジ二点間の結合関係が存在する場合。そして、すべての 2 i 2 * I 2 i + 1 2 * I + 1 次いで、染色図を実行する行に、側を取り付けられています。

#include<bits/stdc++.h>
#define LiangJiaJun main
using namespace std;
int ne,h[200004],cl[200004];
int u[200004],v[200004],n;
struct edge{
    int to,nt;
}e[400004];
void add(int u,int v){
     e[++ne].to=v;e[ne].nt=h[u];
     h[u]=ne;
}
int dfs(int x,int c){
    cl[x]=c;
    for(int i=h[x];i;i=e[i].nt){
        if(!cl[e[i].to]){
            bool t=dfs(e[i].to,3-c);
            if(!t)return 0;
        }
        else if(cl[e[i].to]==cl[x]){
            return 0;
        }
    }
    return 1;
}
int LiangJiaJun(){
    ne=0;
    memset(cl,0,sizeof(cl));
    memset(h,0,sizeof(h));
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&u[i],&v[i]);
        add(u[i],v[i]);
        add(v[i],u[i]);
    }
    for(int i=1;i<=n;i++){
        add(i*2,i*2-1);
        add(i*2-1,i*2);
    }
    for(int i=1;i<=2*n;i++){
        if(!cl[i]){
            if(!dfs(i,1))return puts("-1"),0;
        }
    }
    for(int i=1;i<=n;i++){
        printf("%d %d\n",cl[u[i]],cl[v[i]]);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/dxyinme/article/details/90033800