# SageMath online https://sagecell.sagemath.org/?q=iecuxm # # Cayley graph with 672 nodes and 2352 edges Moore bound=1814 # Obtained by M. Sampels s a Cayley graph for semidirect product Z_6*(39)Z_112 (Communicated July 29, 1997) # generators [2,73]<>[4,23], [5,54]<>[1,22], [5,71]<>[1,31], [3,42] avg.dist 3.496274 # M. Sampels. Large networks with small diameter.. In: Rolf H. Mohring (Ed.): # 23rd International Workshop on Graph-Theoretic Concepts in Computer Science (WG '97), # Lecture Notes in Computer Science 1335, pp. 288-302, Springer-Verlag, 1997 ISBN 3-540-63757-5. # The following graph (F.Comellas 2024) is also from the semidirect product Z_6 x(39)Z_112 # generators [5,48]<>[1,32], [2,9]<>[4,55], [5,33]<>[1,57], [3,84] # Degree Distribution: [0, 0, 0, 0, 0, 0, 0, 672] (avg. deg.: 7.0 max. deg.: 7) # Diameter: 4 avg.dist 3.496274 transmission: 688 Alg.conn. 2.75004 # Aut.group.ord.: 672 / Cayley ? True --- vtx.trans. ? True -- edge.trans. ? False # import networkx as nx #from sage.all import * #from sage.graphs.graph_input import from_networkx_graph sampels672 = Graph(r":~?I__@?A?C?G?O?_@?E?K?W?o@_B?I?S?g@OA_D?M?[?w@oB_F?Q?c@GAOC_H?U?k@WAoD_J?Y?s@gBOE_L?]?{@wBoF_NAQEGKgXOq`dBIESAoXor`fBME[H?UoZ@HAQCcHGK?s`hBQEcAoYOk@hBUBGFOYoN@jBUEkLWZOu__@SEsA_ZO\@lBYE{IOZov`nB]A?Lw[Ow`WBaFCMG[OnAfE?KKWWop`bBBkKSWgpPabDAGIWVGC@RafDMGwWwppb_gEMFWWwE@ZBFEQH?R?qO~BH?oKcXGqOn`^A{G?PGV`K`^EUJ?XWqooBJEUG?XWrPe_uDkKsXgrPea{F}P_bXEoKCZGuPkBOsaMc\GyE?bhFPPB}GaFO^w~odB~FOP{bwIaNaEG}LGbw]AFC^HABgK@GO{C`HAQCCOnP]`ADwLg[Wn@x`YDyQK`@GohCbD{QKcWuaPcdHIHO`pHQQ`MHIA_chDAidmJaVCN@[OUDp?cB?mG]aTDrJeComWnaxdr@KNoi`XoYBOIiTST@TOOD?JiVSP@\PoDt@SQgmgE`iDcJiDomwN`KA}JmLOmx\oVDv?{GGahDPOCSHcRkGPDAcawGiE?nHVa{`UD_Vcap]QXDxACVk\pXA|dz@wC?T`]oJDiLUB?wHoPiF@CS[CYp_B`fBDS[Kapor`aQHOYkJ`iq?EjC?XWwhpPpFDAGDWf@pPCE?MI@GNPJBaayMMHo]PDbbckMM[[I?bBb_iB{LolXYp|DiKOXCS@YbNcOJUJwxHlBc_gDgO_xHZBceGMQ@WSGDoJAYC{OSMpnBz`MC[_kCAAqUGJ@wMP@WF_SCmM[_t@h?cEgLFWVw}wF`\FvIk^[ZPwcFgNHs_{BOwbfGNAGFGYp_cFcQOaNWh@ZCG`OKC`DAGj`rGP@sG_e`nR]dOLw\OzgL`|E{NUUWvhDcH_YO?`KOpBAnGRMg`KDo\`|`vA_FW]_}AlbQOKbsT_yCfa?Q]WHHwea]HNB{GWoaECghPIodDIHPBeG|LWbseQIChhRK_dKE_]a\GWQeIGXpJbgHRAKU`IhRBNE}QiIwyATSicEH{dSR?wbDGFOMYX?qFCQaSI__XEGMB[GF@KUpIwN?|HVF?UGuaTsMHVCWLGiGR@hamEcSghpkQTHIR}OOgAcOYBYSa\@QGO@yEQSaBg[@scmIRSeYxQYcrLGUR}^`NydRmITCcLWqAVDI`MFwQWoadORAcLsh[sPycCIVA[OXQydqmESSmNGfPtcd`_QU^HHQWCr`KF[YXHQ[pJGCQUHgYqeQ[EuO?hcJaWDK_}FKQgswiaTcEHSY?s`~OeDYKmCoQPKoeA]IS\{R@MCLI]U]CXXx}dfjNNKdhVyNd^jPPGlC\`JbmI]UaIoiP^BhJPIOX@BqbP^ILPogpSQhoK?wDS^HPakpwHGSYCg]`Jdh_{K[_HYWmdPJRCwRwo@{o^CAKAToo@zBwHB@GIgu@wpTBkKQIg^@gCRbqK[dxZA~oX@[DGn|GA~oRGkSwm|_IXe?_mIGWPCauE?cCLO[hBR?OZE]Mwkkaqqs|JIUwmCGoS_{AUGCb`XXPdDJJDOSgob?pLFYQKoKaQvE@buKg[xFGW@MDWM]ZGxqKcZIDAoGO_P~CScAIG\S_PRbuHhIO\hSBAETiAXUqsEQheUaKKs\HKrAEUdYNg`PJrJPIFiPGnkJPZD|`ITsnh`RBPQAoEgN?jA]d|c?L?\Hdw|CPIGX]U``RJqeF_OofkVo|bVGXN{``Ma]D`auE{T`GQYoMDWKs`sj@hCXIhASXxCQueXLPA?tCDocDoLRFK]XBQheXLRL_bhJAgEhbmP_eXcwmB^KfAKI`\RHeYdUNW`hihQcqJEYiCWvRTOOEaQwjkJPDaeFyQycPJalD[JrG[RWtq`DT`{L[]XKGDBVFoRgmKC_iBtHcYovKRr[pEBiWWvSfqJCnJ_YovS~a^DLJYZi@`MQheecOOOssB_hA?KUYYYpEQVez_sL?nXmwI@?FmS{mkV@ZBPH?S}DPOqfdsK^JGWo~QodqbWNsapSWWb|GuTgo{E_`A?GoZsxK^BcprDAXgxSqaZdOKKZsxSCaOd]JS[iAgNAkdoLnJKcplx}CyI_[mHG|bGfJaEEsbPZBDqGE}N[gHZGkdaJWWgsSAOGbkH?VcpCeAOCvJ\AgK@GA]EZ_gCcLwiq[fLMp?wRwrBkroImUsrPrRkpAICVWoPuWS`CBSWWw{vAbfF_]P{jPZRlPuGqYOzSA?wAXHuWOr{G@XcCGsWQOh]bAE]LfBcGHCA_eNKxDcP`OQmEl_aCKMoepjDXNL@KFoq`xORB]UCp`eGk@pCkXgyt?arFU_cAgFxOBrqaHsZS{{M`MBCIuXcuKRpmCeHuXeU@cBKeoMHA?KwZaWeaL\A?OglqyE}`QCCM?g`bB{Nd?wO_fP_fchGVw{cFO`@XJ?^M@OrQlFr`UE_WwybUFAbwOGgxUrUOULEYowHswfaRCsTGuXnwK@ND_WgxsU?vA[EYMobx~G^AnEOM_}CDqaeSN`CoLw`Q{F|`SBC]X~WlASFYOwvhsgTafHGUWvkA?aesLy\C{K^@^BDJ][Ox{D_b`{K{\qO_e`bbrG_S@?sHouBYF[^iGpXBRfybqHkU@bcBpXB?PX?{``^cPH_[s{CU`hDDJ{[uFO[bafLM}]uB_hpqbjMe\uGg\@ReoNRI{WgzQJCpJ?`AIoeA?CQOHFKn`mCAOU?}IOWqCXAaKHm`EAGkPrCqIa]qAG``{DcKh@CL?fbiFjNnAGMOg@hF@_]Lg\XCQZdQJp@wOOoqXgM`[H{qPqCFPDA[K{\aEhWAvIm`iBOOPlcJJ[^YGGkQLd{LNCCQ_qRpFtOBB{_@BqXDVJ]WyCGRPUdROpDsXPhRjgW_iFGNW|QGPHB[OCdh`S?PmEuRoqPmGvA~F]]w~yAwg@yEoV@CKaPwEuNIaEG_f`RCWHbAKMoeaPdMOTHg_HVBQfGcsMWaX}CCgT_qFsSg~bBGg__JOwp{SSPpEQLCfHSghAaEISOlYDGCBDHEVOuptxacJHg_HAYFgcAgE_QCrQJg_B\Mi^lDsEPMbnFmTcl{M`tdCKS[W{kyqUdSOW`pCsB_ybRFkSHEcF?S`GEOPKbSYAFdbK{\S}LBqfDpOkaPDcBO^A`FqPckIMWd`WBiMwe`MwLaSJuZ?{X}wLdjKM`|DQKg]`kEWPofP]S]pwCGICaPTAlpID}XCwHzsApjCoNGfhUbFh@`UIKTwrAXdpbmMWs`sR{gN`SH[WXDQmeaQJDgXou`xDRKN?o`XlRngBOrACJGoaZDtLecaOo|A?CTJ_Xm@ONAUfjOYaII?`PsdUKU[PH[F`WcVHkWWtkKOtDMNi`\DK^PWCLJeX{yYRgebZHoTWrPngoAUJU^|CAJwJAgH]WcuHwSgoMBsOCj@[rfQKEAWL@IHsYpDEeT?rhobuhS`OBwShGrCf[`WJ[\ACsUgybcNclhjrhFvQnD[L_sAaE\NR@_CwUsMGrP|@GRpFB_F_OAdiCO_pKBuJEY}DoPojAFPGcIGOqQ]fONW_lJkSPVBBGqVkwCEOm`sCCJHDSZpvd\M{^XAiWGO`}EqRgqHsGC`GCQI?TiKHLcRJi]h?AFcppODQN{jPhBnOxBiJOXWuCZOdEKROpYAcRHe`SFsY`GbYfibMICZg{P~GzagMoi`fsIGkRR?gCgUPSByIFG?a@[RWg\PceqEGT@AbRGyUI@giqWeFMCaTFCW@?AoFqRwnSNPjDQKu\HDYNGJAKDUPojpcGtb{J]Ys{AKS_PDDmLWfh\bPo[CmP{vpzCZhC_oFG^`VREEs_OCkWPOBfFuQNC[RpFqye_MJBgN?yQoF[O?ciM_qQ_EJLc\QL?gqEdwNQ_hHkg@vd_K}[K{SG`IBMH]WxAaSGUbJGeV_uHzgN`PD}NOiAFShp[FaROppob{PMB{MWaxZSQhU_}G_a`TBhGA_cFkTHAq[GjQrCwUXLQwf_OXCGSotAUdWPadqNWvAieFNW`YD?ZpgbyI[b\J{ha@DqKu^XB{A?jaZFmPslYWg\ABEKPgfp_sqokBOIw\`MqnHgauHOZHCAlduRVAkOwnp~cpKWeyJOk`rCaIcY@MCAPBCJIEU{uQ[gM?xDaQskPosyOlAUE[ZXRa|HuawF_QX?QteORpG_SWnaPeBLEfiD_kpfBdIGZPNcUpmBsGSUKwi^hBcAGmQonXtD?QqHGR_hhcRpIA_QSSj@YbQFmSHA_FHXB@EtNogY@OTord{Ko_HPCKP@aRKcYl@aagJ`_D[JwshnCJPECWLc[hlbeG^") com672 = Graph(r":~?I__@?A?C?G?O?_@?E?K?W?o@_B?I?S?g@OA_D?M?[?w@oB_F?Q?c@GAOC_H?U?k@WAoD_J?Y?s@gBOE_L?]?{@wBoF_N?iC_KgXOq`d@SESKgW?r`fBME[KwYOs`hBQEcLGYot`jBUEkHOYou`lBYCOIoZOu`lB]E{H_Zov`nA_FCMG[Ow`pBa@SAgDOI_T@{F[Hoh`_`AEAKCI?a`_b@DwKKJ?op`_oEEB{FwNo^_~EI@GWgC@abDDOKSWwppb`[DCJOWwppbbH@CKcXGO@c_uD[KkXWqpdbJEUF[MwD_U@v@OF[Mwf`g_WAKIo^@CoTCRGeIwZpCoiCR@KOwagcAIa^@sH{RwfpNcV@gFOaw[aJ`QGmNgaxEQKcXDkNW_pEQK`KGq@wbW_aL_yGuB?S@EpJC?GyAObgFAMc\B?PsYGsO{AKEa@gP?sO[BPAKNKNOh@~DEI}GgjxVojC?HWT{UPVokAEIsUC[`WOPBrCsNK]W{px_uJEHOXpWpeDb?sA?U@WqcDbJIUSkhAAaDQJI@gkgJ`TDdB{U[C_uaraOFgU[\PRAsaCJQ@GJo^AsdhDwUcGwPobBQFACWRGH_eB^AYCoU`RA{`KGIGGgGza_`]IASCgGdbR_W@wM_swQ@?CALMXGsxiRSehIgX?r`iOcEhC[NotGtbT_OCGQ_tWxA`Ej@cR_qpjPmElBgJgY`jO\ElG[YsSgE`QacH?Q{G_h@uaEDSQsTWiaBEULqIgiGubEc{KYJgpgVbEbiNIFgR`LbqaeEoSw{hsBqffNM@GC`xrNFMMs][SpxoUBaIS][c`yOxB[Jg]cePbbsaQKG\O|XIbtbMGWQG|Webt_qIs]kIGQ?g`OJWVkI?ga\b|FwTGy`|Od@[FwXkKPIBdeGMUOoxWmbd_uHqBWHo{B@_uFoQWrGLcEg`PAC?M_`COf[OS`XCG}COaKH_XPCH[CP_gEWQguaGq~FKPEMWwQCCQ__JkaSB@UAvGdD]IWTwS`VEzD[NWoxQqdE[O_a{T?ladFXD{VP?xpcBdWOMEGQp`PJAkH{[CQpPaxFV@oHXGyTsja_E[LpIwQcKHCQmSXIwwA}FQQm@wuAUPCC]Jk^HJHnCCHX@wRO~qQcl_qC?ZXJW]bPEmQuOC^@?OSAoG?^[_@PBaeTKg\hHQWp|CGKg`SE`CBYH@OCcCBoMBPH@@cJw\PoptB}KS^sIoybXGRCoMhNYatD_WFgQhPWD`SHMRogkIqaoRCmO[gkNpzdE`AJSZXDabR{HASYHooAMC~IN@[HGZAbofF_NWg{E@RQbDLCOOGhaKOlFRAwS_i`spID[NcfTFa\OM@}Co]@MgcaGCwN}DOf@qCZasHo^@HgzA[In?_jsNPOazI|BoNhOQjD]asTyGWnQQD]_qEkacEQKcz_YF_ZxLakd^aMFKQXVwjCMGeT}H?qwTbJ`AI[XXKgK?]AwO]JWqPfcFbgLGapTI[DS`{EkMpBaiPrD[KGbcUP`CAHjGKWPDQ_Q\ECUuFH\GRbFEuVQ@?_qyPHCcQ}@GQQXdT`GH{^hSAvdtbaHgVH\W~chH[VUMOyglBi_iKo\PRGW@GA[GScc`@sBmHH@WRW{QttQJV?{LOc`MchJVHgYOwQZOGCCMCbxRxSb`H_TiWWwR?oHBKWaAwT`rEG_yFKV@QW\@rIYUqDgSpacYKEWeR?o@keH`SBCgXQBCqXGPA?OXAGF@DFUO_kcV_x@wDURyTP@aEC}_{CWWHBwNDh_{B{QGm@`dBe?NC^xSG[agF}Rck{D@fB~ISVA[O~rIOyC]XmGw^qAEZaYHgZ@WWraYJIWAJ_^@qCsKkXqEGn`nbwKxDcJxVQoE[_sD?THHW^@nGQQSnSJ@BaXC}L?jCrqPcfIp@gHo[@oCi_oCyHoYpZbWFCTuDgvqFc[bKKsb`Sq}pCFYPokP`I?C[LNAgMHGRUpvE?N[m{B@_DzKfGSSX?afEhL\@KJw~QIemcCG_mX\bVPIBsKwf{Y`JCeH}Wy\pNQ_dmaSF_Qw~aaPGBpF_QOtpzc?JfDo^hIaZQNFWRWlPcWOcJHkV_q|FQZEw_YDcR@MxNB^GgWmFgvrFee`UIkbxXb\E}aEG_bPKB^QgD[W[pPngyA`FYTeQGnA_DXLB@o``TqleA_cFORwnQLpqC~H{V?|aIC\KN?wOhEaaDOdiOgi@^rQOT@IT?p`iiZdOMP?{C__`^DT_QKO^hJrNOfFyYGu{U`gCxJw[gxsrPhEYKy[yBOepbcJJ^J[Z`UaveraWQ[lh[RIpACuKSZhLWPAXEJKSZ@CqVcvKt@GDgN`Tcs`YCSI`fr\olIa\aAWNohagJX?kFOwqLDHL`DWbPlBbo[CEM{iXcBmrkFaYotxvWQ`IEAMWo[tp|DoKE[MMpOR?eDLPEwWGx@|dNaaJ{[cx@zcmIQTCtcO_m@iE_SyJ_Zo}epMVDol@xg``jBwKsoCN?rc@HgUCwC^qYFCMnCoTHBQtEbNVOg`xnR^fj_aDOM_wAAEUfkP[o`dbhq\IuXOr@mWPATF?OGb@XwV`zE{OI_PDAcD`JOZuAGZ`AaPF]UYOgd`QF@MtA?Oh^byOKBQPwhp\rgOP@SSwy`xWzBMHOV{uh}WVCiMY[{~KAo_`|CuNwcHiWGBBJaY[xKSP\b}G}RGnkG_maaFwP}bxJqoDvJ{[uGGdPTavGYVqTWn@cfPNPD?TXcc?o|C_R_kparnp@AqUW{P{wWA\FYSGwi@WldCMw\x?kN?uacEAPkfXmg_BaKIZ_zK]plcZHqSoqKSPBBGGqRefHQQzEJKc\q@oZP\bOEmQ_qCs@mBgN?^YBO]`gEdOZA[UpSa}E]NZEsOP^BwG?a{KK`XVBigP_cGO|PzCGphCgKc[@LQifIbWO?r@qBroVDCRSiXXBQPzDWM[eXSyhd`KSXwshyg^ASEuM{]pObPrnFsOW|q?wdA`F]ZXBKIOjDhK_Z?~[d@SEON{_qCg`ppDqNE`uGOib{FyOz@oQ?m`sB}I]UqA?cqMfWNjAoGwqAfdiJtIGYH@QedijSV[rhkBZFw_mEgVPBQHd[LjOsaxGr}GNbgK[`hpcQoWAoF{sXoCBqyEYYL@QEGiAlG?WW}IIWW`mE]_XDKR@ZBYGKPkkx_GO@?DqR[{q?hcBoHCUSn{KQ~eJL][?wsPpGbYHOQwmPpYSCpHy_`B[eprCgMkbEDOQ@?etM_`MZOzBYgUPHD{QgzcHGt`QFW^HGqYd|KfD?L_uQgfsO\B?[xBa]Dz`_D{rpnrgFUbaJ[^HOacEEMjSGhXTsIGfeAOOgPxC]PXBcI[whvsNoNFqOgwiGcWQGDuOpBqNwkA\GkRshxcRRPyCeN_lA?SLP]GIQcipbwnAGL_[{zxxHKBVGkTok@eRpt[JEUtCAKxoC`Iw^HGs_`KbKMi]tD[J_^cUMiaxF[j`lcfPSceAo_P`dVJMYOu{gP[cTJ{_tCs`pVF?M{]s}SD`^BuJcVWtX{YxDxKAapFkFP~CzJcdAT?nptfbNubYAoUotfbPqcU@?DphD@QfAoGohppDlJy[]WwuQWEQOqbIBgjPhFONW^mAWPaHeEKSZo~|`bEeSPmc]HhEqieEQrKsZpARwgFQ@CWO_cbwhBQ^BcGw{Qlh[`?MW^@QbQgdaEF?dpeRMfKOVXcs@hs_hPbmRSl`eSpRkFwQW~yCsdPoDSJ_~yRSkPeBaO{mIXGgCCGiUGuqKZTeqLoclJSfafe?LUeeA`AaKd?OU`}QwrpkGJQkeEPweATEDRVFgcHKA{FEPx?wv`obcHSRFKOkxcr]Hn`[COeXUcJgjdyMw]yDsnhgdiJwg`eCwo}MW\GzAVStRbJyYWxa\WO`ZIYV@CYLhmcKGgaLKqZgP@iMu]C{q[I?ePLm\lNSDPADdKGa|GC}qRcnP]epMcSPGfhN]^PMsJqNEcMM]dNsPPTDzKmbhHTEA_dHPsfHNKJ?mcwMm^\OSD?vbNK]YhGcAqXDZJAcPMy^WaAUF[YGvYRg]DKJaV\Hq]t?o`DwOou`qsjphJGWSpYTs~iC_iLocxpBlH__aH?nPeBNH_SLCS^PORiFgRN@?GGlbFEoRMgaLxDqlfaNkeuDGO?ue`M?etPSdaWdpN__LM[U?uASLe\@MYbGVa{IUWS~qBs{Q@CeJgwXvs{IMayLokXeCDGZRxI[VGubhflRwhAA?``|DxOka\OCO@UCVKYaHEY_wD`kEaRCsAJc]o{CeN?hXkc[hFbQJc`pWr`HBQbH?ZHIQ{fQQYdiUo}A`eLNAdXK[IQId\L?]|JyYgkCoJeZG~iXcwQ@ISW[wQASuHu") sampels672nx =sampels672.networkx_graph() # List of graphs to process graphs = [('Sampels672 ', sampels672),('Com672 ', com672)] def count_k_cycles(G, k): count = 0 visited = set() def dfs(path, start, depth): nonlocal count current = path[-1] # Early exit if we?re going too deep if depth == k: if start in G.neighbors(current): # Normalize to avoid duplicates cycle = tuple(sorted(path)) if cycle not in visited: visited.add(cycle) count += 1 return for neighbor in G.neighbors(current): if neighbor not in path and neighbor >= start: dfs(path + [neighbor], start, depth + 1) for v in G.vertices(): dfs([v], v, 1) return count # each cycle counted twice (once forward, once reverse) def algebraic_connectivity(G): """ Compute the algebraic connectivity (Fiedler value) of a graph G. INPUT: - G: a SageMath Graph OUTPUT: - The second-smallest eigenvalue of the Laplacian matrix of G """ L = G.laplacian_matrix() eigenvalues = L.eigenvalues() eigenvalues.sort() if len(eigenvalues) < 2: return 0 # Trivial case: empty or isolated vertex graph return eigenvalues[1] def domination_number(G): """ Compute the domination number of a graph G using MILP. INPUT: - G: a SageMath Graph OUTPUT: - The domination number (integer) """ p = MixedIntegerLinearProgram(maximization=False) x = p.new_variable(binary=True) # Objective: minimize the number of chosen vertices p.set_objective(sum(x[v] for v in G.vertices())) # Constraint: each vertex is dominated for v in G.vertices(): p.add_constraint(x[v] + sum(x[u] for u in G.neighbors(v)) >= 1) return p.solve() # Print properties for each graph in the list print("\n Main properties of the graph\n") for label, graph in graphs: print(f"{label} | Ord.: {graph.order()} / Size: {graph.size()} " f" / Diam.: {graph.diameter()} / Avg.dist: {graph.average_distance().n(digits=6)} \n" f" / 7-reg.? {graph.is_regular(k=7)} / Degree histogram: {nx.degree_histogram(sampels672nx)} / Girth: {graph.girth()}\n " f" / Alg.conn. {algebraic_connectivity(graph).n(digits=6)}") #/ Domin. number: {domination_number(graph)} ") print("\n Symmetry properties of the graph\n") for label, graph in graphs: print(f"{label} | Aut.group.ord.: {graph.automorphism_group().order()} / Cayley ? {graph.is_cayley()} --- vtx.trans. ? {graph.is_vertex_transitive()} -- edge.trans. ? {graph.is_edge_transitive()}" ) def check_all_isomorphisms(graph_list): n = len(graph_list) print("\n Isomorphism check of all pairs (a dot means non isomorphic):") for i in range(n): label_i, G_i = graph_list[i] for j in range(i + 1, n): label_j, G_j = graph_list[j] if G_i.is_isomorphic(G_j): print(f"\n{label_i} is isomorphic to {label_j}") else: print(".", end="") print() # Newline at the end check_all_isomorphisms(graphs) # Compute the distance distribution from a given vertex v in graph G # Returns a list where the i-th element is the number of vertices at distance i from v def distance_distribution(G, v): from collections import Counter distances = G.shortest_path_lengths(v) distribution = Counter(distances.values()) result = [distribution[d] for d in sorted(distribution)] return result print("\n") for label, graph in graphs: print(f"{label} distance distrib from vtx. 0: {distance_distribution(graph, 0)}") # Counting k-cycles for each graph print("\nNumber of k-cycles for k=3 up to 6") for label, graph in graphs: print(f"{label} ", " ".join(str(count_k_cycles(graph, k)) for k in range(3, 7))) print("\n") ##