----隣接行列データ構造 - 隣接リスト



グラフG =(V、E)を表すために、二つの標準的な表現、すなわち隣接リストおよび隣接行列が存在します。有向グラフで使用することができる2つの表現は、無向グラフを使用することもできます。通常、このようにしているので、隣接リスト表現は、よりコンパクトな(図ポイント数のエッジの数よりもはるかに小さい)疎なグラフを表します。図遭遇するが、緻密(| E |閉じる| V | ^ 2)または2つはすぐに与えられた頂点の右側に接続があるか否かを決定しなければならない
例えば通常隣接行列表記、最短経路アルゴリズム、それ隣接行列表現。

 

 







する#include <stdio.hに> する#include <string.hの> する#include <STDLIB.H> の#define MAXN 50 //邻接矩阵 INTエッジ[MAXN] [MAXN]。 INT他の(){ int型I、J。 N INT、M。 V、Uをint型。 int型のOD、ID; (1){一方 のscanf( "%D%dの"、&N、&M)。 IF(N == 0 && M == 0){ のprintf( "没有输入边和点的个数\ n"); ブレーク; } のmemset(エッジ、0、はsizeof(エッジ))。 用(i = 0; iがmを<; iは++){ scanf関数( "%d個の%のD"、&U、およびV)。 エッジ[U-1] [V-1] = 1。 } {式(I ++; iがn <I = 0)のため 、OD = 0。 {(; J <N J ++ J = 0)のための OD + =エッジ[I] [J]。 } inheadアーク; printf( "%dの"、OD)。 } } のprintf( "の\ n"); {(私は++; iがn <I = 0)するための ID = 0。 {(; J <N J ++ J = 0)するための ID + =エッジ[j]は[I]。 } IF(I == 0){ のprintf( "%dの"、ID)。 } 他{ のprintf( "%dの"、ID)。 } } のprintf( "の\ n"); } 0を返します。 } //邻接表 のtypedef構造体arcnode *アーク。 VNO *構造体のvnodeのtypedef。 typedefは構造体lgraphの*のLGR。 構造体arcnode { int型のID。 アークnext_arcnode。 }。 構造体のvnode { int型のID。 アークはouthead。 }。


構造体lgraph { 構造体のvnodeのvnode [MAXN]。 int型のVEX = 0; INTアーク= 0。 }。 (){create_null_lg LGR } LGR create_lg(LGR LG){ ; iはint型 N INT、M。 アークP = NULL; 用(i = 0; I <LG-> VEX; iは++){ LG-> vノード[i]は.inhead = LG-> vノード[i]は.outhead = NULL; } (i = 0; I <LG->アーク; iは++){ため のscanf( "%D%dの"、&N、&M)。 N - ; M--; P =(ARC)はmalloc(はsizeof(構造体arcnode))。 P-> ID = M。 P-> next_arcnode = LG-> vノード[N] .inhead。 LG-> vノード[N] .inhead = P。 P =(ARC)はmalloc(はsizeof(構造体arcnode))。 LG-> P-> ID = N。 P-> next_arcnode = LG-> vノード[M] .outhead。 int型のID、OD; アークのp; LG lgraph構造体。 } 戻りLG。 } ボイドfree_lg(LGR LG){ I int型。 アークのp; 用(i = 0; I <LG-> VEX; iは++){ P = LG-> vノード[i]は.inhead。 一方、(!p = NULL){ LG-> vノード[i]は.inhead = P-> next_arcnode。 無料(P); P = LG-> vノード[i]は.inhead。 } P = LG-> vノード[i]は.outhead。 一方、(!p = NULL){ LG-> vノード[i]は.outhead = P-> next_arcnode。 無料(P); P = LG-> vノード[i]は.outhead。 } } } (メインINT){ iがint型。 int型M、N。 (1){一方 のprintf( "输入多少条边和点")。 scanf関数( "%d個の%のD"、および(lg.vex)、&(lg.arc))。 (lg.vex == 0){もし 破ります。 } create_lg(&LG)。 用(i = 0; iは<lg.vex; iは++){ OD = 0。 P = lg.vnodes [I] .inhead。 しばらく(!P = NULL){ OD ++; P = P - > next_arcnode。 } IF(I == 0){ のprintf( "%dの"、OD)。 } 他{ のprintf( "%dの"、OD)。 } } のprintf( "の\ n"); 用(i = 0; iは<lg.vex; iは++){ ID = 0。 P = lg.vnodes [I] .outhead。 一方、(!p = NULL){ ID ++。 P = P - > next_arcnode。 IF(I == 0){ のprintf( "%dの"、ID)。 } 他{ のprintf( "%dの"、ID)。 } } のprintf( "の\ n"); } 0を返します。 }

 

 

おすすめ

転載: www.cnblogs.com/hywhyme/p/11610929.html