// MST_kruskal void MST_kruskal(MGraph G) { int vSet[MAXSIZE]; // 辅助结构,vSet[i] == vSet[j] 表示i,j属于同一个连通分量 for (int vertexNo = 0; vertexNo < G.vertexNum; ++vertexNo) { vSet[vertexNo] = vertexNo; // 初始时,所有的顶点均属于不同的连通分量 } // 处理边 Edge *edge = (Edge*)malloc(G.edgeNum * sizeof(Edge)); // 辅助存储结构,存储所有边 storeEdge(G, edge); sortEdge(edge, G.edgeNum); // 找n - 1条边 int edgeNo = 0; int index = 0; while (index < G.vertexNum - 1) { int s1 = vSet[edge[edgeNo].vex1]; int s2 = vSet[edge[edgeNo].vex2]; if (s1 != s2) // 该边的顶点不属于同一个连通分量 { mstedge[index] = edge[edgeNo]; // 将该边保存到最小生成树 // 将s2所属的连通分量加入到s1所属的连通分量 for (int vertexNo = 0; vertexNo < G.vertexNum; ++vertexNo) { if (s2 == vSet[vertexNo]) { vSet[vertexNo] = s1; } } index++; } edgeNo++; } free(edge); }
void Graph::readGraph() { NodeID fromID, toID; char *contents; int fd; struct stat s; size_t length; //open fd = open(inputFileName.c_str(), O_RDONLY); if (fd == -1) handle_error("open",ERR_OPENING_FILE); //obtain file size if (fstat(fd, &s) == -1) handle_error("fstat",ERR_READING_FILE); length = s.st_size; //map the contents contents = (char*) mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0); if (contents == MAP_FAILED) handle_error("mmap",ERR_MEMORY_ALLOC); istringstream iss(contents); iss>>NN>>NE; cout<<"The number of nodes in the graph is NN = "<<NN <<" and the number of edges is NE = "<<NE<<endl<<endl; while(iss>>fromID>>toID) { storeEdge(fromID,toID); } //close input file munmap(contents,length); close(fd); }//end of readGraph()