图的深度遍历算法

问题描述:
输入:
建立图的存储结构:顶点和边(弧),例:无向图G的顶点V={A,B,C,D,E,F,G,H},边E={(A,B),(A,C),(B,D),(B,E),(C,F),(C,G),(D,H),(E,H),(F,G)}(G具有8个顶点和9条边)
输出:
深度优先遍历的顶点序列(按照存储结构):A,B,D,H,E,C,F,G(或者其它的不同顺序的序列)`
c语言实现代码:

#include <stdio.h>
    #define Max 10
    typedef char VertexType;
typedef int EdgeType;
typedef struct 
{
VertexType vexs[Max]; // 顶点信息
    EdgeType edges[Max][Max];//边和弧的信息
    int n;  //当前图顶点数
    int e;  //当前边数
}MGraph;

void createGraph(MGraph *G){//创建图
    int i,j,n,e,a,la,k;
    char ex;
    printf("请输入图的顶点数(小于10):\n");
    scanf("%d",&n); 
    G->n=n;
    printf("请输入所有顶点的信息(如:a b):\n");
    getchar();
    for(i=0;i<n;i++){
    scanf("%c",&G->vexs[i]);
    getchar();  
    } 
    printf("请输入图的边数:");
    scanf("%d",&e);
    G->e=e;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            //printf("%c和%c:",G->vexs[i],G->vexs[j]); 
        //  scanf("%d",&a);
        G->edges[i][j]=0;
        }

    }
    printf("请输入边的信息(若两点相连就输入 1):\n");
    for(i=0;i<n;i++){
            printf("%c和几个点相连请输入:",G->vexs[i]); 
        scanf("%d",&la);
            printf("%c和哪些点相连请输入(如:a b):",G->vexs[i]);
            getchar();
        for(k=0;k<la;k++){
            scanf("%c",&ex);
            getchar();
        G->edges[i][ex-'a']=1;
        }
    }

}
void prinG(MGraph *G){//输出矩阵
    int i,j;
    for(i=0;i<G->n;i++){
        printf("  %c",G->vexs[i]);
    }
printf("\n");
    for(i=0;i<G->n;i++){
        printf("%c",G->vexs[i]);
        for(j=0;j<G->n;j++){
            printf("  %d",G->edges[i][j]);
        }
        printf("\n");
    }
}
void DFT(MGraph *G,int visited[]){   //深度遍历
        int i;
        for(i=0;i<G->n;i++){  
                DFTcore(G,i,visited);  
        }  
        printf("\n");  
}  
int DFTcore(MGraph *G,int i,int visited[]){ //递归查找
        int j; 
        if(visited[i] == 1){  
                return;  
        }  
        printf("%c ",G->vexs[i]);  
        visited[i] =1;   
        for(j=0;j<G->n;j++){  
                if(G->edges[i][j]==1){  
                        DFTcore(G,j,visited);  
                }  
        }  
}
int main(){
    MGraph G;
    int visited[Max]={0};
    createGraph(&G);
    prinG(&G);
    printf("进行深度遍历:");
    DFT(&G,&visited);
    return 0;
}


这里写图片描述

这里写图片描述

代码用作自己储存,同时希望对你有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值