問題の解決策[M]図着色問題

トピックの背景

  与えられた無向グラフGおよびMは異なる色です。これらのグラフG色、各頂点の色の各頂点を着色します。頂点2つの異なる色の各エッジを着色Gがある場合ので、M着色図と呼ばれます。M着色問題は、すべての異なるシェーディングを見つけるために、所与のグラフGおよびM色のものです。

 

タイトル説明

  与えられた無向グラフGとMのため、図の計算方法のすべてのプログラミングを着色異なる、などの異なる色です。

 

入力形式

  最初の行は、n個の頂点と辺、M色と与えられたグラフG kを表し、3つの正の整数N、KとMを有しています。頂点は1,2、...、nと番号が付けられています。次のk行は、各行は2つの正の整数、U、Vを有し、エッジグラフG(U、V)を表します。

 

出力フォーマット

   実行が終了すると、出力の異なる着色スキームの計算された数。

 

サンプル入力

5 8 4

1 2

1 3

1 4

2 3

2 4

2 5

3 4

4 5

 

サンプル出力

48

 

説明

  N <= 100; K <= 2500。

  十分にそのときに大きなn個のkが大きなことを確認します。

  ノー20,000以上のことを確保するための答え。

 

問題の解決策

  他の剪定を言っても過言ではありません。この質問、実際の出発点で、我々は、検索最終出力は$ m個の$缶(乗算原理)を乗じただけの色を、検索する必要があります。

#include <入出力ストリーム> の#define MAX_N(100 + 5)
 の#define MAX_K(2500 + 5)
 の#define MAX_M(2500 + 5)を使用して名前空間STDを、構造体のエッジ
{ INT に、
    int型の次; 
}。INTのN、K、M。
INT H [MAX_N]、TOT。
エッジe [MAX_K + MAX_K]。
INT [MAX_N] [MAX_M] C。
int型ANS; 
インラインボイド Add_Edge(INT U、INT V)
{ 
    E [ ++ TOT] .TO = V。
    E [TOT] .next =



 


    


H [U]。
    H [U] = TOT。
    返します
} 

ボイド DFS(INT U)
{ 
    場合(U> N)
    {
         ++ ANS。
        返します
    } 
    ため(登録をint i = 1 ; I <= M; ++ i)が
    { 
        場合(C [U] [I])を続けます(登録INT ; J J = [U] J = HをE [J] .next)
        {
             ++ C [E [J] .TO] [I]。
        } 
        DFS(U + 1);
        (登録INT ; J J = [U] J = HをE [J] .next)
        {
             - ; C [E [J] .TO] [I] 
        } 
    } 
    を返します
} 

int型のmain()
{ 
    CIN >> N >> K >> M。
    int型のuを、V。 
    (登録をint i = 1 ; iが= Kを<++ I)
    { 
        CIN >> U >> V。
        Add_Edge(U、V); 
        Add_Edge(V、U);    
    } 
    のための登録(int型 [I =さh 1を]; 私; I = E [I] .next)
    {
         ++、C [E [I] .TO] [ 1 ]。
    } 
    DFS(2 )。
    coutの << ANS *のメートル。
    リターン 0 ; 
}
リファレンスプログラム

 

おすすめ

転載: www.cnblogs.com/kcn999/p/10988665.html