#include <ビット/ STDC ++ H.> の#define F(I、A、B)は(INT I = A;私は= Bを<; I ++) の#define LLロングロング の#define PF(A)のprintf(「% D「A) の#define PHNプット(」「) 使用して 名前空間STD; int型(読み取り); / * 。決まっ起点を容易に選択することができない場合* M ^ 2への電流の最適化、そうでなければカードアークが、側面が存在しなければなりません彼は、直接接続されていない1 * / の#define N 400010 INT T、N-、M; INTチュー[N]、ルテニウム[N]、デュ[N]から[N << 1。 ]、FIR [N << 1 ]、ID [N << 1 ]、頭部[N]、CNT; 無効追加(int型の Xを、int型 Yを、INTID){に[++ CNT] = Y;モミ[CNT] =頭部[X];頭部[X] = CNT; ID [CNT] = ID;} int型 STA [N << 1 ]、VIS [N < < 1 ]、トップ。 ボイド DFS1(int型X){ ため(int型 I = ヘッド[X]; I;){ ながら(I && VIS [i])とI = FIR [I]。 場合(I){ VIS [I] = 1頭[X]は=; モミ[I]; ([I]に)DFS1。 STA [ ++トップ] = ID [i]は、 I = ヘッド[X]。 } } } 無効 DFS2(int型X){ ため(int型 I = ヘッド[X]; I;){ ながら(I && VIS [I] && VIS [I ^ 1 ])は、i = FIR [I]。 もし(I){ VIS [I] = VIS [iは^ 1 ] = 1 ;頭部[X] = モミ[I]。 ([I]に)DFS2。 STA [ ++トップ] = ID [i]は、 I = ヘッド[X]。 } } } ボイド WORK1(){ // 不交换、单向 CNT = 0 。 用(int型 I = 1、U、V、I <= M; ++I){ U =を読み取る(); V = 読み取ります()。 (U、V、i)を追加します。++チュー[U]; ++ RU [V]。 } INT S = [に対して2 ]、x = 0、Y = 0 。 F(I、1 、N){ 場合(チュー[I] -ru [I] == 1)++ X、S = I。 そう であれば(RU [I] -chu [I] == 1)++ Y。 それ以外の 場合(!チュー[I] = RU [I]){ プット(" NO ");終了(0 ); } } もし ||((!X &&!y)は(x ==1 &&のy == 1 ))。 他 {プット(" NO ")、出口(0 );} DFS1(S); F(I、1 、M){ 場合(!VIS [I]){プット(" NO ")、出口(0 );} } プット(" YES " ); 以下のために(int型 I =頂; I> 0 ; - I)PF(STA [I]); PHN。 / * memsetの(VIS、0、はsizeof(VIS)); { - (I; I> 0、I =トップINT)のために 、S = [I]に、VIS [I] = 1。 } (!VIS [i])とF(I、1、m)の場合プット( "WA"); プット(「よりよいです」)。* / } ボイド WORK2(){ // 交换、双向 CNT = 1 。 以下のために(int型 I = 1 ; I <= M ++、U、V {I) U =を読み取る(); V = 読み取ります()。 (U、V、i)を追加し、追加(、uとVを、 - I)。 ++デュ[U]; ++ デュ[V]。 } INT S =乃至[ 2 ]、x = 0 。 F(I、1 、N){ 場合(DU [I]&1)++ X、S = I。 } 場合(Xの==2 ||!バツ); 他 {プット(" NO ")、出口(0 );} DFS2(S); F(I、1 、M){ 場合(VIS [I <<!1 ] || VIS [I <<!1 | 1 {プット(])" NO ")、出口(0 );} } プット(" YES " ); 以下のために(int型 I =頂; I> 0 ; - I)PF(STA [I]); PHN。 } int型のmain(){ freopenは(" merge.in "、「R"STDIN); freopenは(" merge.out " " W "STDOUT); / * * * /// freopenは(" ex_merge4.in " "R"、STDIN); // freopenは(" merge.out 」、 ")、" W STDOUT; T =)は(読み取り; N =(読み取り); mは= read()は、 もし(Tの== 2 )WORK1(); そうでない場合(T == 1 )WORK2(); } int型読み取り(){ int型、S = 0、F = 0 ; CHAR CH = GETCHAR(); ながら(!isdigit(CH))は、f = CH == '- " 、CH = getchar関数(); 一方、(isdigit(CH))S = sの* 10 +(CH ^ 48)、CH = GETCHAR()。 返す fは- ?sの:秒; } / * G ++ dp.cpp ./a.out G ++ merge.cpp -std = C ++ 11 ./a.out 2 5 2 3 2 5 3 4 1 2 4 2 * /
この質問のために:アーク電流を最適化する、または決まった出発点がない場合、M ^ 2にはまり込む選ぶことができますが、彼の側にあっ接続されている必要があり、あなたは直接1を使用することはできません。
アーク電流は、N + Mを添加した後、中にスナップまたはすることができ、M ^ 2(2点直接縁mに接続されています)