图以及DFS和BFS

来源:互联网 发布:linux bond配置 编辑:程序博客网 时间:2024/06/03 11:47

图:

struct Edge{    Point start;    Point end;};class graph{private:    int edge[1000][1000];    Edge edge_set[1000];    int Pnum = 0;    int Enum = 0;    Point pset[1000];public:    graph()    {        memset(edge, 0, sizeof(edge));    }    //增加点    void addpoint(Point a);    //增加边    void addedge(int i, int j,int value);    //清空点    void clear_pset();    void clear_edge();    //通过向量叉乘符号来进行定义 ,必须严格大于0,在一条线上的也不算left     bool toleft(Point a, Point b, Point k);    int cross_product(Point a, Point b, Point k);    bool in_triangle(Point a, Point b, Point c, Point k);    int graham_scan(Point *res);    //返回extreme edge的个数    int EE(Point *res);    //Jarvis Marching    int JM(Point *res);    void dijkstra(int start_p,int res[][2]);    void floyd(int dist[][1000], int mid[][1000]);    void bfs(int start,int *res);    void dfs(int start);};

BFS:用一个队列来实现距离越短越先访问

void graph::bfs(int start,int *dis){    queue<int> q;    int Pnum = this->Pnum;    int visit[1000];//0代表从未访问(white),1代表它的前一个节点已经访问到(gray),2代表已经被访问到(black)    memset(visit, 0, sizeof(visit));    q.push(start);    dis[start] = 0;    while (!q.empty())    {        int p_now = q.front();        q.pop();        for (int i = 0; i < Pnum; i++)//        {            if (p_now == i)                continue;            if (this->edge[p_now][i] && visit[i] == 0)            {                q.push(i);                visit[i] = 1;                if (dis[i] == 0)                    dis[i] = dis[p_now] + 1;//dis为其前一个节点的距离+1            }        }        //visit[p_now] = 2;    }}

DFS:

//用栈可以实现回溯调用,//1 如果有可能,访问一个领接的未访问的节点,标记它,并把它放入栈中。//2 当不能执行规则 1 时,如果栈不为空,则从栈中弹出一个元素。//3 如果不能执行规则 1 和规则 2 时,则完成了遍历。void graph::dfs(int start){    int Pnum = this->Pnum;    int visit[1000];    memset(visit, 0, sizeof(visit));    stack<int> s;    s.push(start);    int step;    int h = 0;    cout << start << "h:" << h << endl;    while (!s.empty())    {        int find = 0;        int p = s.top();        for (int i = 0; i < Pnum; i++)        {            if (!visit[i] && edge[p][i])            {                find = 1;                s.push(i);                visit[i] = 1;                cout << i << " ";                h++;                cout << "h:" << h << endl;                              //break;此处不该break,应该先把其相邻的节点一次性找到,标为灰色的节点!            }        }        if (!find)        {            s.pop();            h--;        }    }}
0 0
原创粉丝点击