DFS
コード:
書式#include <アルゴリズム> 書式#include <iostreamの> の#include <cstdioを> std名前空間を使用しました。 INTのN、M、P、Q、ANS1、ANS2、lenの; INTのANS [35]、合計[35]。 OK BOOL [35]。 構造体haochi { int型のZL、JG、CTB。 INTのTOT、DR [35]。 フレンドブール演算子<(CONST haochi&X、CONST haochi&Y) {x.zl <y.zl返します。} }湯[35]。 ボイドDFS(INTハオ、INTレイ、INT銭) { IF(銭> m)のリターン; (ハオ== N + 1)であれば { IF((LEI> ANS1)||(LEI == ANS1 &&銭> ANS2)) { LEN = 0。 (; iが<= N I ++ iは1 = INT)のための IF(OK [i])とANS [++ LEN = I。 ANS1 =レイ。 ANS2 =銭。 } 返します。 } IF(レイ+(N-ハオ+ 1)<ANS1 ||(レイ+(N-ハオ+ 1)== ANS1 &&銭+和[ハオ] <= ANS2))リターン。 (湯[ハオ] .ctb)であれば { DFS(ハオ+ 1、LEI、銭)。 返します。 } OK [ハオ] = 1。 以下のために(INT I = 1; I <=優[ハオ] .tot; ++ I)ゆう[ゆう[ハオ] .DR [I] CTB ++。 DFS(ハオ+ 1、レイ+ 1、+銭湯[ハオ] .jg)。 [ハオ] = 0 OK。 以下のために(INT I = 1; I <=優[ハオ] .tot; ++ I)ゆう[ゆう[ハオ] .DR [I] ctb--。 DFS(LEIハオ+ 1、銭)。 } int型のmain() { freopenは( "fish.in"、 "R"、STDIN)。 freopenは( "fish.out"、 "W"、STDOUT)。 CIN >> M >> N。 ( "%d個の%のD"、&湯[I] .zl、&湯[I] .jg)scanfのため(++ I; iは= N <I = 1 INT)。 ソート(湯+ 1、湯+ 1 + N)。 一方、(scanf関数( "%D%dの"、&P、&Q)&& P && q)は 湯[P] .DR [++湯[P] .tot] = Q。 湯[Q] .DR [++湯[Q] .tot] = P。 } DFS(1,0,0)。 coutの<< ANS1 <<」「<< ANS2 <<てendl; ( "%Dを\ n"、ANS [i])とのprintfをするための(iは++; iは= LEN <I = 1 INT)。 FCLOSE(STDIN); FCLOSE(STDOUT)。 0を返します。 } / * 170 7 1 70 2 50 3 30 4 40 5 40 6 30 7 20 1 4 1 7 3 4 3 5 5 7 6 7 0 0 * /