タイトル効果:各々は、特定の魅力値は、次いで、得られる1からn + 1から、この魅力的な図によれば、最大値、および出力パス(必要数が小柄でしか存在し、有向グラフあります都市への都市のより多く)。
ソリューション:それは最短経路+レコードを考えるのは簡単です。しかし、少しやり過ぎを感じ。私の方法は、iが最大カリスマ子ノードを表し、それは、マップではなく、リングを有するツリー、WAのように1つの所与れるDFS + DP、DP [i]が起動することである......
ポジティブなソリューション:forループ2、DP [i]を最初から都市iの第二の都市への最高の状態を表しています。その後、私未満のすべての都市を列挙
状態遷移方程式DP [I] = MAX(DP [I]、DP [J] + ARR [i])と(J <I)。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 N = 200 ; INTのDP [N]。 INT MP [N] [N]。 int型のn; int型T1; int型のプレ[N]。 INT ARR [N]。 ボイドプリント(int型X){ もし(x == 1 ){ COUT << 1 。 リターン; } (PRE [X])を印刷。 printf(" - >%D " 、X)。 } 無効(解決int型T){ memsetの(DP、0、はsizeof DP)。 memset(MP、0、はsizeof MP)。 memsetの(前、0、はsizeof PRE)。 memsetの(ARR、0、はsizeof ARR)。 cinを >> N; 以下のために(INT iが= 1 ; I <= N; I ++)CIN >> ARR [I]。 int型メートル; cinを >> メートル。 以下のために(INT iが= 1 ; I <= M; I ++ ){ int型のX、Y。 CIN>> X >> Y。 MP [X] [Y] = 1 。 } ため(INT iが= 1 ; I <= N + 1 ; I ++ ){ ため(INT J = 1、J <I、J ++ ){ 場合(MP [j] [i]は&& DP [I] <DP [J] + ARR [I]){ DP [I] = DP [J] + ARR [I]。 事前[I] = J。 } } } のprintf(" CASE%d個#\ n " 、T)。 printf(" ポイント:"); COUT << DP [N + 1 ] << ENDL。 printf(" サーキット:" ); 印刷(プレ[N + 1 ])。 printf(" - > 1つの\ N " ); もし(!T = T1)はcout << てendl; } int型のmain(){ CIN >> T1。 以下のために(INT iが= 1 ; iが<= T1、iは++ )(i)を解きます。 リターン 0 ; }