形式一样,只是变量名不同。。没检查出错。可能是存入那一块有问题,但无奈眼力不够。

来源:3-6 图的编码实战-图的广度优先遍历

qq_卡拉巴赫_04029622

2017-12-12 23:32

http://img2.mukewang.com/5a2ff5ee00013b6212230731.jpg

#include<iostream>

#include<stdlib.h>

#include<vector>

#include<windows.h>

using namespace std;

class Node

{

public:

    Node(char data=0);

    char cData;

    bool isvisited;

};

Node::Node(char data)

{

    cData = data;

    isvisited = false;

}



class Cmap

{

public:

    Cmap(int capacity);

    ~Cmap();

    bool addnode(Node *pnode);

    void resetnode();

    bool youxiangtu(int row,int col,int val=1);

    bool wuxiangtu(int row,int col,int val=1);


    void coutjz();//打印邻接矩阵


    void depth(int nodeindex);//深度优先

    void breadth(int nodeindex);//广度优先


private:

    bool getvalue(int row ,int col,int &val);//从矩阵中获取权值

    void breadthway(vector<int>preVec);//广度优先遍历实现函数


    int iCapacity;//图中可容纳最多的点数

    int inodecount;//已经添加的节点个数

    Node *pnodearray;

    int *pMatrix;


};

Cmap::Cmap(int capacity)

{

    iCapacity=capacity;

    inodecount=0;

    pnodearray=new Node[iCapacity];

    pMatrix=new int[iCapacity*iCapacity];

    memset(pMatrix,0,iCapacity*iCapacity*sizeof(int));//邻接矩阵初始化

}

Cmap::~Cmap()

{

    delete[]pMatrix;

    delete[]pnodearray;

}

bool Cmap:: addnode(Node *pnode)

{

    if(pnode == NULL)

    {

        return false;

    }

    pnodearray[inodecount].cData=pnode->cData;

    inodecount++;

    return true;


}

void Cmap::resetnode()

{

    for(int i = 0;i<inodecount;i++)

    {

        pnodearray[i].isvisited=false;

    }

}

bool Cmap:: youxiangtu(int row,int col,int val)

{

    if(row <0||row>=iCapacity)

    {

        return false;

    }

    if(col<0||col>=iCapacity)

    {

        return false;

    }

    pMatrix[row*iCapacity+col]=val;

    return true;

}

bool Cmap:: wuxiangtu(int row,int col,int val)

{

    if(row <0||row>=iCapacity)

    {

        return false;

    }

    if(col<0||col>=iCapacity)

    {

        return false;

    }

    pMatrix[row*iCapacity+col];

    pMatrix[col*iCapacity+row];

    return true;

}

bool Cmap:: getvalue(int row ,int col,int &val)

{

    if(row <0||row>=iCapacity)

    {

        return false;

    }

    if(col<0||col>=iCapacity)

    {

        return false;

    }

    val =pMatrix[row*iCapacity+col];

    return true;

}

void Cmap:: coutjz()

{

    for(int i=0;i<iCapacity;i++)

    {

        for(int k=0;k<iCapacity;k++)

        {

            cout<<pMatrix[i*iCapacity+k]<<' ';

        }

    cout <<endl;

    }

}

//深度优先搜索

void Cmap:: depth(int nodeindex)

{

    int value=0;

    cout << pnodearray[nodeindex].cData<<' ';

    pnodearray[nodeindex].isvisited=true;

    //通过邻接矩阵判断是否有其他顶点连接

    for(int i =0;i<iCapacity;i++)

    {

        getvalue(nodeindex ,i,value);

        if(value!=0)//判断有弧连接其他顶点

        {

            //判断该店是否被访问过

            if(pnodearray[i].isvisited)

            {

                continue;

            }

            else

            {

                depth(i);

            }

        }

        else

        {

            continue;

        }

    }

}

//广度优先便利算法

void Cmap:: breadth(int nodeindex)

{

     cout << pnodearray[nodeindex].cData<<' ';

     pnodearray[nodeindex].isvisited=true;


     vector<int>curVec;

     curVec.push_back(nodeindex);


     breadthway(curVec);

}

void Cmap:: breadthway(vector<int>preVec)

{

    int value =0;

    vector<int>curVec;


    for(int j=0;j<(int)preVec.size();j++)

    {

        for(int i=0;i>iCapacity;i++)

        {

            getvalue(preVec[j],i,value);

            if(value!=0)

            {

                if(pnodearray[i].isvisited)

                {

                    continue;

                }

                else

                {

                    cout << pnodearray[i].cData;

                    pnodearray[i].isvisited=true;


                    curVec.push_back(i);

                }

            }

        }

    }

    if(curVec.size()==0)

    {

        return;

    }

    else

    {

        breadthway(curVec);

    }

}

int main()

{

    Cmap *pMap=new Cmap(8);


    Node *pnodea=new Node('A');

    Node *pnodeb=new Node('B');

    Node *pnodec=new Node('C');

    Node *pnoded=new Node('D');

    Node *pnodee=new Node('E');

    Node *pnodef=new Node('F');

    Node *pnodeg=new Node('G');

    Node *pnodeh=new Node('H');


    pMap->addnode(pnodea);

    pMap->addnode(pnodeb);

    pMap->addnode(pnodec);

    pMap->addnode(pnoded);

    pMap->addnode(pnodee);

    pMap->addnode(pnodef);

    pMap->addnode(pnodeg);

    pMap->addnode(pnodeh);


    pMap-> wuxiangtu(0,1);

    pMap-> wuxiangtu(0,3);

    pMap-> wuxiangtu(1,2);

    pMap-> wuxiangtu(1,5);

    pMap-> wuxiangtu(3,6);

    pMap-> wuxiangtu(3,7);

    pMap-> wuxiangtu(6,7);

    pMap-> wuxiangtu(2,4);

    pMap-> wuxiangtu(4,5);


    pMap->coutjz();

    cout << endl;


    pMap->resetnode();

    pMap->depth(0);

    cout << endl;


    pMap->resetnode();

    pMap->breadth(0);

    cout << endl;


    //system("pause");

    return 0;



}


写回答 关注

2回答

  • HanCHEN
    2018-08-27 17:57:12

    void Cmap:: breadthway(vector<int>preVec)

    {

        int value =0;

        vector<int>curVec;


        for(int j=0;j<(int)preVec.size();j++)

        {

            for(int i=0;i<iCapacity;i++)//这边误写大于号

            {

                getvalue(preVec[j],i,value);

                if(value!=0)

                {

                    if(pnodearray[i].isvisited)

                    {

                        continue;

                    }

                    else

                    {

                        cout << pnodearray[i].cData<<" ";//这边少加空格

                        pnodearray[i].isvisited=true;


                        curVec.push_back(i);

                    }

                }

            }

        }

        if(curVec.size()==0)

        {

            return;

        }

        else

        {

            breadthway(curVec);

        }

    }


  • qq_人生如期_0
    2017-12-14 10:46:35

    bool Cmap:: wuxiangtu(int row,int col,int val)

    {

        if(row <0||row>=iCapacity)

        {

            return false;

        }

        if(col<0||col>=iCapacity)

        {

            return false;

        }

        pMatrix[row*iCapacity+col]=val;

        pMatrix[col*iCapacity+row]=val;

        return true;

    }


    qq_卡拉巴...

    灰常感谢。。。小龙虾了。。

    2017-12-21 14:02:36

    共 1 条回复 >

数据结构探险之图篇

图是众多实际问题解决方案之源,从基础概念入手掌握图的处理

56337 学习 · 81 问题

查看课程

相似问题