[グラフ理論] [タイトル]青ブラシタイトル

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>のプランを旅行

 

おすすめ

転載: www.cnblogs.com/xwww666666/p/11420155.html
おすすめ