Ich hatte meine Forschung über was gerichtete und ungerichtete Graphen gemacht haben. Mein Ansatz ist es, den DFS-Algorithmus zu verwenden. Ich weiß, wenn visitedM[iVertices]
ist true
oder der Knoten zweimal besucht wird bedeutet, dass es kein Baum ist. Ich bestimme auch, ob ein Graph ein Baum ist. Ich verwende den folgenden Satz.Bestimmen Sie, ob ein ungerichteter Graph ein Baum ist
Theorem: Any connected graph with n vertices and n-1 edges is a tree
Mein Code wird durch das Lesen aus einer Datei, die Anzahl der Scheitelpunkte und Anzahl der Kanten, wie unten
6 7
1 2
1 5
1 6
2 5
initialisieren Wie Sie jede Kante auf einer Linie mit Quellen Vertex und Ziel Vertex aufgeführt sehen . Scheitelpunkte beginnen bei 1. Kanten sind ungerichtet und werden in der Datei aufgeführt, sobald sie mit der kleinsten Scheitelpunkt-ID beginnen. Für die Kanten 2-5 und 5-2 hat die Datei beispielsweise nur 2-5.
Mein Problem ist, dass ich keine Ahnung habe, ob ich den Knotenspeicher zuweisen soll, wie füge ich den Knoten in das Diagramm ein, wie kann ich meinen DFS-Code zurückgeben, ist kein Baum. Ich habe auch die void dfs
als int-Funktion, die die Anzahl der besuchten Ecken zurückgibt. int dft(grapg *g, int iV, int VisitedM[])
. Die Funktion ist ähnlich wie meine void DFS
, aber sie gibt 0 wenn visitedM[iV]
, visitedM[iV] = TRUE
zurück und gibt iCount
zurück. Ich nehme auch an, dass meine Datenstruktur unordentlich ist.
#define MAX_VERTICES 100
typedef struct EdgeNode
{
int y;
int w; //weight
int iVertex //susbcript in vertexM for TO Vertex
struct EdgeNode *pNextEdge;
}EdgeNode;
typedef struct Vertex
{
char szLabel[100 +1 ];
EdgeNode *successorList;
}Vertex;
typedef struct
{
int iNumVertices;
int iNumEdges;
int iDirected;
Vertex vertexM[MAX_VERTICES +1];
int iParent[MAX_VERTICES + 1];
int iVisitedM[MAX_VERTICES + 1];
int degree[MAX_VERTICES + 1];
EdgeNode *edge[MAX_VERTICES +1];
}GraphImp;
typedef GraphImp *Graph;
int main(int argc, char *argv[])
{
FILE *pFile;
Graph graph;
char szInputBuffer[100];
int numEdges, numVertices;
pFile = fopen("a.txt","r");
if(pFile == NULL)
{
printf("FILE DOES NOT EXIST \n");
return;
}
//reads file until EOF
while(fscanf(pFile, "%d%d", &graph.iVertices, &graph.iEdges) != EOF)
{
//printf is to track the input from file
printf("num of vertices: %d \n num of edeges: %d \n",graph.iVertices, graph.iEdges);
}
fclose(pFile);
}
void dft(Graph *g, int iV, int visitedM[])
{
EdgeNode *e;
if(visitedM[iV])
return;
for(e = g->vertexM[iV].sucessorList; e!= NULL; e = e->pNextEdge)
{
dft(g, e->iVertex, visitedM);
}
}
Ich verstehe Ihre Vorgehensweise. Was wäre jedoch besser, diesen Algorithmus zwischen Adjazenzliste oder Adjazenzmatrix zu implementieren? –
@ EduardoJuarez Weder. Jede Kante wird nur einmal benötigt. So kann der Code eine Kante aus der Datei lesen, die Farbinformationen aktualisieren und die Kante verwerfen. Es ist nicht notwendig, die Kanten zu speichern. – user3386109
Muss ich Speicher reservieren? –