HDU 6311カバー(オイラー経路)

#include <ビット/ STDC ++。H>
#define N 100005
名前空間stdを使用。
構造体のエッジ{
    次へint型。
    できBOOL;
}エッジ[N * 4]; /// 4エッジの総数よりも大きい倍(2つの*双方向側面およびおそらくはプラス側)へ

N INT、M、
各点の度合[N]、///
ヘッド[N]、最後のシーケンス番号の///側が各ポイントに追加され
CNT、///エッジ数
RES; ///パスは、の合計を発見しました

BOOLねじ[N]。
ベクター<整数> ST; ///通信媒体を保存は、奇数ブロックポイントであります
ベクター<整数>道路[N]。

無効アドオン(int型のu、int型V){
    エッジ[++ CNT] .next =ヘッド[U]。
    エッジ[CNT] .TO = V。
    エッジ[CNT] .able = TRUE。
    ヘッド[U] = CNT。
    ++度[U];
}
インラインボイドadd_edge(INT U、V INT){
    (V、U)を追加します。
    (V、U)を追加。
}

ボイドDFS(int型の){
    VIS [S] =真。
    IF(度[S]&1)st.push_back(S);
    用(INT I =ヘッド[S]; I; I =エッジ[I] .next){
        もしDFS(エッジ[i]の.TO)(VIS [エッジ[i]は.TO]!)。
    }
}

ボイドDFS2(int型の){
    用(INT I =ヘッド[S]; I; I =エッジ[I] .next){
        IF(エッジ[I] .able){
            エッジ[I] .able =エッジ[I ^ 1] =偽.able。
            DFS2(エッジ[I] .TO)。
            IF(I> 2 * M + 1)++ RES; ///このエッジポイントの奇数により得られる説明が追加されるので、このループは終了しました。
            他の{
                道路[RES] .push_back(I / 2 *(2 *(I&1)-1))。
            }
        }
    }
}

{int型のmain()
    あなたと、V。
    一方、(CIN >> N >> M){
        CNT = 1、なし= 0。
        {(; iがmで<++ iが0 = INT)のために
            scanf関数( "%d個の%d個"、&U、&V);
            add_edge(U、V);
        }
        {(; iが<= N I ++ iは1 = INT)のために
            (もし!VIS [i]と学位[I]){
                DFS(I); ///通信ブロックと奇数の点を見つけます。
                IF(st.empty()){
                    st.push_back(I);
                    st.push_back(I);
                }
                (J + = 2; J <st.size()INT J = 2){///奇数開始の第二の対の縁部から双方向ポイントを追加するための
                    add_edge(ST [J]、ST [J + 1])。
                }
                解像度++;
                DFS2(ST [0])。
                st.clear();
            }
        }
        
        printf( "%d個の\ n"、RES)。
        {(; iが= RESを<++ iが1 = INT)のために
            printf( "%dの"、道路[I] .size())。
            (INT J = 0; J <道路[I] .size(); ++ j)のための{
                printf( "%dの"、道路[I] [J])。
            }
            プット( "");
            道路[I] .clear();
        }
        {(; iが<= N I ++ iは1 = INT)のために
            ビューの[i]を=偽;
            [I] = 0ヘッド。
            度[I] = 0;
        }
    }
}

  

カバー

制限時間:3000分の6000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):440受理提出(S):65
特別審査員


問題の説明
ウォールがダウンしており、北の王はセンチネルに彼の兵士を送信する必要があります。
ノース無向グラフ(接続する必要はない)のような点であることができる、1人の兵士1つのパスをカバーすることができます。今日、そこには非常に多くの人々はまだ北に呼吸をしないですので、王は彼が正確に一度、各エッジをカバーするために送られた兵士の数を最小限にしたいと考えています。彼のマスターとして、あなたは兵士を配置する方法を彼に教えてください。
 

 

入力
あなたが入力の最後まで読む必要はありませんもう20よりも、複数のテストケースがあるかもしれません。
グラフのノードおよびエッジの数を表す第1の行、二つの整数nおよびmは、です。
次のm行では、各エッジの2つの端部を表す、2つの整数を含みます。
全くの平行エッジや自己ループはありません。
1 N M 100000
 

 

出力
各テストケースのために、最初の行が必要なルート、Pの数を含んでいます。
次のPラインのため、最初に整数xは、使用されるエッジのリストを表し、X整数続きます。すべての整数は、正または負の整数でなければなりません。その絶対値は、選択されたエッジ(1〜N)の数を表します。それが肯定なら、それはそうでなければ、このエッジが入力異なる方向に通過しなければならない、このエッジが入力される方向として渡さなければならないことを示しています。エッジが正しい順序でなければなりません。
 

 

サンプル入力
3 3
1 2
1 3
2 3
 
サンプル出力
1
3 1 3 -2
 

 解決:

(|度(奇数)| / 2、1)リンクを考慮し、各ブロック内で、リンクのブロックが設けられ、連通図エンドがストロークN N = maxの必要

2奇数度の頂点がある場合、もう一方は偶数である、あなたはまた、オイラーパスを実行するためのいずれかの奇数度の頂点を選択することができます。しかしながら、奇数の頂点のリンクブロックは、奇数と偶数の辺の間の頂点の必要次いで、2よりも大きい場合、次いで奇数ランオイラー経路の頂点を選択し、等も省略縁よりも、最終的により

 

 

コード:

 

おすすめ

転載: www.cnblogs.com/zhangbuang/p/11700769.html