トピックの背景
与えられた無向グラフ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 ; }