1>ニューラルネットワーク
グリーンタイトル
なぜトポロジー?
1)必要条件:DAG
2)ショーを計算する必要があるこのタイトルの式は、このポイントに接続することができ、境界*小数点値のすべて
ので、私はこの点をプッシュし始めたとき、すべての彼の先駆的なポイントのすべての状況を要件が終了し
、これが唯一のtopo_sortすることができます
書式#include <cstdioを> する#include <cstdlib> 書式#include <キュー> の#include <ベクトル> 使用して 名前空間はstd; INTのN、M。 CONSTの INT N = 103 。 INT [N]、C における[N]、SZ [N]。 構造体ノード { int型V、W。 ノード(INT VV、INT WW) {V = W = VV、WW。} ノード(){} }。 ベクター <ノード> G [N]。 キュー < 整数 > Q; 空隙topo_sort() { ながら(!q.empty()) { int型 T = q.front(); q.pop()。 SZ [T] = G [T] .size()。 以下のために(int型 I = 0 ; iがSZ [t]を<; Iは++ ) { ノードv = G [T] [I]。 もし(C [T]> 0)C [VV] + = C [T] * VW。 もし( - に [VV] == 0 )q.push(VV)。 } } } int型のmain() { scanf関数(" %D%D "、&N、&M)。 int型のx; 以下のために(int型 i = 1 ; iが<= N; iは++ ) { scanf関数(" %d個の%のD "、&C [i]は、&x)は、 もし(C [i]が> 0 )q.push(I)。 他 C [I] - =のX。 } int型U、V、W。 一方、(M-- ) { scanf関数(" %D%D%D "、&U&V、およびW) G [U] .push_back(ノード(V、W))。 で [V] ++ ; } topo_sort()。 BOOL =失敗真。 以下のために(int型私= 1 ; iが<= N; iが++ ) 場合(SZ [I] && C [I]!> 0 ) { のprintf(" %D%D \ n " 、I、C [I])。 失敗 = 偽; } であれば(フェイル)のprintf(" NULLを\ n " ); リターン 0 ; }
2>キャンパスネットワーク
>難し:
DAG、及びどのように最小側、全ての辺が描画強連結成分になるよう
>うち、中の点で問題を分析しようとすると、
エッジ:+1浸透+1度を
>投機:
有向グラフを凝縮した後の任意の時点で
、それいくつかのエッジを追加するようにのみ強連結成分において、
エッジ最小= MAX(0度点、0度の点)の数追加
>証拠。 (luogu)
任意のDAGは、チェーンの複数形成しなければならない、始点と終点V Uが存在しなければなりません
私たちはまず、ああ、エッジV> U-少しチェーンを確立するポイントになりました
点-1は、0度点0 -1
上記の手順を繰り返し、
最終的にはすべての度ゼロ点のまでは、ゼロ度ポイント、なくなっています、
図ルックは、何のチェーンが存在しない、次のリングがある、またはその最後の唯一の強連結成分
#include <cstdioを> する#include <cstdlib> の#include <ベクトル> の#include <スタック> の#include <アルゴリズム> 使用して 名前空間STDを、 int型nは、合計。 const int型の N = 10003 ; ベクター < INT > G [N]。 INT FA [N]、SZ [N]、DFN [N]、低[N]、TT。 スタック < int型 > S; ブールF [N]。 ボイド tarjan(INT X) { [X] DFN =低[X] = ++ TT。 F [X] = 真、s.push(X)。 SZ [X] = G [X] .size()。 以下のために(int型 i = 0 ; I <SZ [X]; iは++ ) { int型、V = G [X] [I]; もし(!DFN [V]) { tarjan(V)。 低[X] = 分(低[x]は、低[V])。 } そう であれば(F [V])に ロー[X] = 分(低[x]は、低[V])。 } もし(DFN [X] == 低[X]) { ++ 和。 一方、(s.top()!= X) F [s.top()]= 偽、FA [s.top()] = 和、s.pop()。 F [X] = 偽、FA [X] = 和、s.pop()。 } } int型 で [N]、アウト [N]。// 存和节点的入度 INT メイン() { scanf関数(" %のD "、&N) int型のx; 以下のために(int型 I = 1 iは++; iが<= N ) 、一方(〜のscanf(" %dの"、およびX)&& x)を G [i]は.push_back(X)。 以下のための(int型 I = 1 iが++; iが<= N ) であれば(![I])tarjan(I)DFN。 以下のために(int型 iは= 1 ; iがn = <; iは++ ) { int型 FU = FA [i]は、FV。 用(INT J = 0 ; J <SZ [I]; J ++ ) { INT = V G [I] [J]。 FV = FA [V]。 もし(!FU = FV)で [FV] ++、アウト [FU] ++ ; } } int型 ANS1 = 0、ANS2 =0 ; 用(int型 i = 1 ; iが<=和iが++ ) { 場合(!で ANS1 ++ [I]) 。 もし(!アウト [i])とANS2 ++ ; } のprintf(" %d個の\ n%D " 、ANS1、MAX(ANS1、ANS2))。 リターン 0 ; }
3>のプランを旅行