educoder实训平台 数据结构 图(第一关)图的深度优先遍历

///
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Graph.h"
/
Graph* Graph_Create(int n)
{
    Graph* g=(Graph*)malloc(sizeof(Graph));
    g->n=n;
    g->vetex=(char**)malloc(sizeof(char*)*n);
    int i;
    for (i=0; i<n; i++) g->vetex[i] = NULL;
    g->adj=(int*)malloc(sizeof(int)*n*n);
    int j;
    for(i=0; i<n; i++) {
        for(j=0; j<n; j++) {
            g->adj[i*n+j]=0;
        }
    }
    return g;
}

void Graph_Free(Graph* g)
{
    free(g->adj);
    int i;
    for (i=0; i<g->n; i++) free(g->vetex[i]);
    free(g->vetex);
    free(g);
}

int Graph_DepthFirst(Graph*g, int start, Edge* tree)
//从start号顶点出发深度优先遍历,(编号从开始)
//返回访问到的顶点数,
//tree[]输出遍历树
//返回的tree[0]是(-1, start),
//真正的遍历树保存在tree[1..return-1], return是返回值
//顶点的访问次序依次为tree[0].to, tree[1].to, ..., tree[return-1].to
//输入时,tree[]的长度至少为顶点数
//返回值是从start出发访问到的顶点数
{
    /*请在BEGIN和END之间实现你的代码*/
    /*****BEGIN*****/
    const int MAX=1000;
    Edge queue[MAX];
    int top=-1;
#define In__(a,b)  {top++;queue[top].from=a; queue[top].to=b;}
#define Out__(a,b)  {a=queue[top].from; b=queue[top].to;top--;}
#define QueueNotEmpty (top>=0?1:0)
#define HasEdge(i,j)  (g->adj[(i)*g->n+(j)]==1)
    char* visited=(char*)malloc(sizeof(char)*g->n);
    memset(visited, 0, sizeof(char)*g->n);
    int parent=-1; 
    int curr=start;
    In__(parent, curr); 
    int k=0; 
    while(QueueNotEmpty) 
    {
       Out__(parent, curr);
        if (visited[curr])
            continue; 
        visited[curr]=1; 
            tree[k].from=parent;
            tree[k].to=curr;
            k++;
            int j;
            for(j=g->n-1;j>=0;j--)
            {
                if(HasEdge(curr,j)&&!visited[j])
                In__(curr,j);
            }
    }
    return k;
    #undef In__
#undef Out__
#undef QueueNotEmpty
#undef HasEdge
    /*****END*******/
}

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值