トピックへのリンク: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 }