Example #1
0
//  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);
}
Example #2
0
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()