ツリーは、モジュロ3 == 0の点(x、y)の順序対の間の経路の長さは、この長さはANS0ます追加した場合。
モジュロ== 1〜3と、このANS1長が追加されます。
==モジュロ2〜3ならば、それはこのANS2長が追加されます。
あなたBEG ANS0、ANS1、ANS2ください。
入力フォーマット:
最初の行は、整数nを含んでいるが、Nであり、それが表すポイント
N-1行以下、それぞれの行は、Bの経路長V、入力ループを有しているから入力三つの整数、B、V、代表であり、複数のエッジが存在することを確認します
出力フォーマット:
出力三の整数を含むが、応答モード3つの路長1E9 + 7に格納されています。
例:
5
0 1 2
0 2 3
0 3 7
0 4 6
54 60 30
明らかに、これは限り、この点は同じ点からサブツリーのモジュラスに記録されているように、ツリーDPです。
場合境界状態遷移ことに留意されたいです。
#include <ビット/ STDC ++ H> の#pragma GCCの最適化(2) の#pragma GCCの最適化(3) の#define P十億七 の#define INC(I、B)iは= INT(登録のため、私は= Bを<。 I ++) 私は= int型の#define 12月(私は、A、B)のために(登録; I> = B; i--) 名前空間stdを使用します。 テンプレート<クラスnTの> インラインボイド読み取る(NT&X) { チャーC。一方、(C = GETCHAR(),! isdigit(c)参照)。 X = C ^ 48。(C = GETCHAR()、isdigit(c)参照)、一方、X = X * 10 + C-48。 } int型のヘッド[2000010]、CNT。 クラスlittlestar { パブリック: int型へ。 int型のNXT。 int型のw; ボイド追加(INT U、int型V、int型GG){ = Vまで; NXT =頭部[U]。 W = GG。 ヘッド[U] = CNT。 } }星[2000010]。 int型G [1000010] [4]。 ボイドDFS(INT U、INT FA) { G [U] [0] = 1。 {(; iはi =星[I] .nxt [U] I =ヘッドINT)のため のint V =スター[I] .TO。 (== FA V)続けるならば、 DFS(V、U); INC(j、0,2)G [U] [(J + 1スター[I] .W%3)%3] + = G [V] [J]。 } } 長い長いANS [5]、[1000010] F [4]。 長い長いTMP [5]、[5] TOT。 ボイドDP(INT U、INT FA) { (INT I =ヘッド[U]; I; I =星[I] .nxt)用{ int型V =スター[I] .TO。 (== FA V)続けるならば、 DP(V、U); TMP [0] = tmpに[1] = TMP [2] = 0。 TOT [0] [2] = 0 TOT [1] = TOTを=。 INC(j、0,2){ TMP [(J +星[I] .W)%3] =(TMP [(J +星[I] .W)%3] + F [v] [J]) %のP。 TMP [(J + 1スター[I] .W)%3] =(TMP [(J +星[I] .W)%3] + G [V] [J] *星[I] .W%のP) %のP。 TOTの[(J + 1スター[i]は.W)%3] =(TOTの[(J +スター[i]は.W)%3] + G [V] [j])%のP。 } INC(j、0,2){ INC(k、0,2){ ANS [(J + K)%3] =(ANS [(J + K)%3] + TMP [J] *(G [ U] [K] [K]を-tot))%のP。 } } INC(j、0,2){ F [U] [J] =(F [U] [J] + TMP [J])%のP。 } } } int型のmain() { int型のn; (n)を読み出します。 INC(I、1、N-1){ UをINT、V、W。(U)を読みます。(v)を読みます。(W)を読み取ります。 ++ U; ++ V; 星[++ CNT] .add(U、V、W)。 星[++ CNT] .add(V、U、W)。 } DFS(1,0)。 DP(1,0)。 COUT << ANS [0] * 2%P << " "<< ANS [1] * 2%P <<"" << ANS [2] * 2%P。