連結成分(隣接情報テーブルストレージを使用して)

ベクターと隣接関係テーブルを達成

ベクター<INT> G [100]; //図頂点隣接テーブルの手段100

G [U] .push_back(V) ; // U 頂点vへの頂点からビデオエッジ、すなわち二次元アレイG [100]を作成する等価[I]

//頂点uの隣接頂点vを検索

以下のために(; [U] .size()I <G; INT iが0 = Iは++){

  INT V = G [U] [I]。

  .......

 }

 

 方法の利点を示す隣接テーブル

  メモリ空間の辺の数に比例するだけ

のデメリット隣接リスト表現

(1)次に、U頂点vへの頂点との間の関係の調査は、消費O(n)の隣接リストを検索するには、Uと隣接するn個の頂点の数をみましょう。

(2)困難な有効エッジを削除します

 

書式#include <iostreamの> 
の#include <ベクトル> 
の#include <スタック>
 使用して 名前空間をSTD。

静的 のconst  int型 MAX = 100000 ;
静的 のconst  int型 NIL = - 1 ;

int型のn;
ベクター < INT > G [MAX]。
INTの色[MAX]。

// 深さ優先トラバーサル   
ボイド DFS(INT R&LT、INT C){
    スタック < 整数 > S;
    S.push(R)
    色[R] = C。
    しばらく(!S.empty()){
         int型のu = S.top();
        S.pop();
        以下のためにINT iが= 0 ; I <Gを[U] .size(); I ++ ){
             int型、V = G [U] [I]。
            もし(色[V] == NIL){
                色[V] = C。
                S.push(V);
            }
        }
    }
} 

ボイドassignColor(){
     int型の ID = 1 ;
     // 初期値設定
    のためのINT I = 0、I <N - 、I ++)カラー[I] = NIL;
     // 開始点としてUに未訪問深さ優先探索
    INT U = 0 ; U <N-; U ++ ){
         IF(色[U] == NIL)DFS(U、ID ++ )。
    }
}

INT のmain(){
     int型S、T、M、Q;
     // n個(頂点の数)ユーザ、mは関係の数である 
    CIN >> N- M;
     // ビルド隣接リスト
    のためのINT I = 0。 I <M、I ++ ){
        CIN >> S >> トン。
        G [S] .push_back(T)。
        G [t]は.push_back(S);
    }
    // 深さ優先トラバーサル、色が同じ値を頂点に設定されるに接続することができる
    assignColor()。
    
    cinを >> Q;
    
    以下のためにINT iが= 0 ; I <Qと、I ++ ){
        CIN >> S >> トン。
        もし(色[S] == 色[T]){
            裁判所未満 << " はい" << てendl;
        }
        他の{
            裁判所未満 << " ノー" << てendl;
        }
    }
    
    リターン 0 ;
}

/ *
10 9 
0 1 
0 2
3 4 
5 7
5 6
6 7
6 8
7 8 
8 9
3
0 1
5 9
1 3
* / 

 

おすすめ

転載: www.cnblogs.com/mr-wei977955490/p/12622116.html