私は、無向グラフと無向グラフについて研究しました。私のアプローチは、DFSアルゴリズムを使用することです。私はvisitedM[iVertices]
がtrue
であるか、またはノードが2回訪問されたときにはそれがツリーではないことを意味します。私はまた、グラフが次の定理を使用する木かどうかを決定します。無向グラフが木であるかどうかを調べる
Theorem: Any connected graph with n vertices and n-1 edges is a tree
私のコードは、各エッジがソース頂点と目的地頂点と一行上に記載されている見ることができるように
6 7
1 2
1 5
1 6
2 5
以下のようにファイルから頂点と辺の数の数を読み取ることによって初期化され。頂点は1から始まります。エッジは無向であり、最小の頂点IDで始まるファイルには が一度リストされます。たとえば、エッジ2-5,5-2の場合、ファイルは2-5しかありません。
私の問題は、ノードのメモリを割り当てる必要があるかどうか、ノードをグラフに挿入する方法、DFSコードからの私の返信方法をツリーではないことです。また、私はvoid dfs
を訪問先の頂点の数を返すint関数として持っています。 int dft(grapg *g, int iV, int VisitedM[])
。関数はvoid DFS
と似ていますが、visitedM[iV]
,visitedM[iV] = TRUE
の場合は0 を返し、iCount
を返します。 私はまた私のデータ構造が乱雑であると推測します。
#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);
}
}
私はあなたのアプローチを理解しています。しかし、隣接リストまたは隣接行列の間にこのアルゴリズムを実装する方がよいでしょうか? –
@EduardoJuarezどちらもありません。各エッジは1回だけ必要です。したがって、コードはファイルからエッジを読み取り、カラー情報を更新し、エッジを破棄することができます。エッジを保存する必要はありません。 – user3386109
私はメモリを割り当てる必要がありますか? –