マーシュ湿地の物語シリーズ - 設計された風景HDU - 4514

トピックへのリンク:https://vjudge.net/problem/HDU-4514

質問の意味:何のリングが存在しない場合は、リングを判断してはいけない、人気のある話が最長の道を見つけることです、ストロークの同等は長い描くことができます。

アイデア:DFSは、リングを宣告しました。

最後にリングの不在さ:最長の方法は、我々はすべての側面を通過する時点で開始することができ、最長の道を見つけ、

しかし、それは必ずしもロードマップは、この点だけからAが最長の道路がAを使い果たしているBに行き、実行するために始めた、と言うことができる最長最長の道路ではありません、

それが脳卒中であるため、だから我々はちょうどC Bが長く走ったよりもおそらくBに行き、点Bチャートから再度実行する必要があります。

そして、出発点までの​​すべての方法からチュチュの実行を開始された道路Bを駆け上がりました。

この図は、ユニコム、注意を払う必要があるからなるサブグラフの多くを持っていないかもしれません。


  1の#include <iostreamの>
   2の#include <cstdioを>
   3の#include <CStringの>
   4の#include <アルゴリズム>
   5の#include <キュー>
   6の#include <地図>
   7の#include <cmath>
   8の#include <iomanip>
   9  使用 名前空間はstd;
10  
11のtypedef 長い LL。
12  の#define INF(1LL << 25)
 13  の#define担当者(I、J、K)(I =(J)がINT iが++; iが=(K)<)のための
 14  の#defineのrep __(i、j、k)を(I =(J)がINTのために、I <(K)。
 (; I> =(K)i-- I =(J)INT)のための(I、J、K)当たり
 16  の#define __あたり(i、j、k)は、()I =(J int型のために、I> (K); i--)
 17  
18  のconst  int型 N = 100010 19  のconst  int型 M = 1000010 20  
21  構造体ノード{
 22  
23      INT に、
24      INT W。
25      int型の次。
26 }エッジ[M << 1 ]。
27  
28  のint ヘッド[N]。
29  int型の CNT; // 链式前向星
30 BOOL VIS [N];
 31は、 BOOL [N]を用い; // サブピクチャケース決定するための
32  INT DIS [N]を、
 33である INT ; N-、M
 34は 
35  ボイド追加(INT U、int型 V、INT W){
 36      
37      エッジ[CNT] .TO = V;
 38である      エッジ[CNT] .W = W;
 39      エッジ[CNT]は.next = 頭部[U]を、
 40の      ヘッド[U] = CNT ++ ;
 41れる }
 42は、 
43である 
44である BOOL DFS(INT事前に、int型今){
 45  
46      場合(使用[今])を返す 47      {
 48が          使用される[今] = 49  
50          のためにINT ;〜O、O = O =頭部[今] {エッジ[O] .next)
 51              のint V = エッジ[O] .TO。
52              であれば(V == PRE)続けます// 与之前的点不冲突
53              場合(DFS(今、V))を返す 54          }
 55  
56          リターン 57      }    
 58  }
 59  
60  
61  空隙 dfs_d(int型今){
 62  
63      VIS [今] = 64は、      使用[今] = 65      のためにINT ;〜O、O = O =頭部[今] {エッジ[O] .next)
 66          のint V = エッジ[O] .TO。
67          INT = W エッジ[O] .W。
68          であれば(VIS [V])続けます69の 
70          DIS [V] = DIS [今] + W。
71         dfs_d(V);
 72      }
 73である }
 74  
75  int型ワーク(int型今){
 76  
77      REP(I、1。 DIS [I] = N-)0 ;
 78      REP(I、1、N-)VIS [I]は= falseに;
 79      dfs_d(今); // nは実行
80  
81      int型のインデックス= -を1 ;
 82      int型 LEN = - 1。;
 83      // 最長経路を見つける
84      REP(Iを、1。{N-)
 85          IF(LEN <DIS [i])とLEN = DIS [i]は、インデックス= I。
86      }
 87      
88      担当者(I、1、n)のDIS [I] = 0 ;
89      担当者(I、1、N)VIS [I] = 90      dfs_d(インデックス)// 反跑
91  
92      担当者(I、1、N)lenを= MAX(LEN、DIS [I])。
93  
94      リターンLEN。
95  }
 96  
97  INT メイン(){
 98の 
99      IOS :: sync_with_stdio()。
100      cin.tie(0 );
 101  
102      INT U、V、W;
 103は     、一方(CIN >> N- M){
 104  
105          CNT = 0 ; // 辺初期の数
106          REP(I、1、N-)ヘッド[I] = - 1 ; // 最初の初期化
107  
108          REP(I、1 、m)の{
 109              CIN Vを>> >> U W;
 110  
111              追加(U、V、W);
 112              追加(V、U、W)。
 113          }
 114  
115          REP(I、1、N-)中古[I]は= falseに ; // 通信初期図
1 16          BOOL OK = trueに;
 117  
1 18          // ヘッド[X]は== -1はエッジが記載されていないと、それが接続され、それが関数に入力する必要はありません
119          REP(Iを。1 、N-){
 120              IF(中古[I] ||頭[I] == - 1。 続行;
 121  
122  
123              // 判断がリング
124              IF(DFS(0 、I)){
 125                  = OK falseに126                  BREAK ;
 127              }
 128          }
129  
130          もし(!OK)はcout << " YES " << てendl;
131          他の{
 132  
133              INT ANS = - 1 134              担当者(iは、1、n)は使用[I] = // 连通图初始化
135              のrep(I、1、n)の場合(使用[I]!)場合(ヘッド[I] =! - 1)ANS = MAX(ANS、ワーク(I))。
136の 
137              COUT << ANS << ENDL。
138          }
 139      }
140  
141      GETCHAR()。getchar関数();
142      戻り 0 ;
143 }

 

おすすめ

転載: www.cnblogs.com/SSummerZzz/p/11305328.html