// Loads a (directed, undirected or multi) graph from a text file InFNm with 1 node and all its edges in a single line. void IOConnList() { const int NNodes = 500; const int NEdges = 2000; const char *FName = "demo.graph.dat"; PNEGraph GOut, GIn; GOut = GenRndGnm<PNEGraph>(NNodes, NEdges); // Create graph file FILE *F = fopen(FName, "w"); for (TNEGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { fprintf(F, "%d", NI.GetId()); for (int i = 0; i < NI.GetOutDeg(); i++) { fprintf(F, " %d", NI.GetOutNId(i)); } fprintf(F, "\n"); } fclose(F); // Load edge list GIn = LoadConnList<PNEGraph>(FName); PrintGStats("ConnList - Out", GOut); PrintGStats("ConnList - In", GIn); }
// Save and load directed, undirected and multi-graphs, where node names are strings void IOEdgeListStr() { const int NNodes = 1000; const int NEdges = 5000; const char *FName = "demo.graph.dat"; PNEGraph GOut, GIn; // Can also be PUNGraph or PNGraph GOut = GenRndGnm<PNEGraph>(NNodes, NEdges); // Output nodes as random strings TIntStrH OutNIdStrH; TStrHash<TInt> OutStrNIdH; // Generate unique random strings for graph TStr RandStr; for (TNEGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { do { RandStr.Clr(); TInt RandLen = TInt::Rnd.GetUniDevInt(5, 30); for (int i = 0; i < RandLen; i++) { TStr RandChar(TInt::Rnd.GetUniDevInt(33, 126)); RandStr += RandChar; } } while (OutStrNIdH.IsKey(RandStr) || RandStr[0] == '#'); // Not unique or starts with comment OutNIdStrH.AddDat(NI.GetId(), RandStr); OutStrNIdH.AddDat(RandStr, NI.GetId()); } // Create graph file FILE *F = fopen(FName, "w"); for (TNEGraph::TEdgeI EI = GOut->BegEI(); EI < GOut->EndEI(); EI++) { TInt Src = EI.GetSrcNId(); TInt Dst = EI.GetDstNId(); fprintf(F, "%s %s\n", OutNIdStrH[Src].CStr(), OutNIdStrH[Dst].CStr()); } fclose(F); // Load edge list of strings TStrHash<TInt> InStrToNIdH; GIn = LoadEdgeListStr<PNEGraph>(FName, 0, 1, InStrToNIdH); PrintGStats<PNEGraph>("EdgeListStr - Out", GOut); PrintGStats<PNEGraph>("EdgeListStr - In", GIn); }