深度-first遍历图--邻接表实现

本文介绍了如何使用邻接表表示图,并通过递归方法实现深度优先遍历算法,详细解释了创建图、展示图及遍历过程,包括时间复杂度分析。

在这里,邻接表的实现与深度优先遍历图,使用递归。

#include<iostream>
using namespace std;
#define VERTEXNUM 5//结点数
struct  edgenode  
{  
    int to;  
    int weight; // 边的权值
    edgenode *next;  
};  
struct vnode  
{  
    int from;  
    edgenode *first;  
};
void createGraph(vnode *adjilist, int start, int end,int weight);
void displayGraph(vnode *adjilist,int nodeNum);
void DFT(vnode *adjilist,int* vertexStatusArr,int nodeNum);
void DFTcore(vnode *adjilist,int i,int* vertexStatusArr);

int main(void){
		
		//创建图
	    vnode adjilist[VERTEXNUM];
		int nodeNum=VERTEXNUM;
		for(int i=0;i<nodeNum;i++)
			adjilist[i].first=NULL;
		int vertexStatusArr[VERTEXNUM]={0};
		cout<<vertexStatusArr[4]<<endl;
        createGraph(adjilist,0,3,0);
        createGraph(adjilist,0,4,0);
        createGraph(adjilist,3,1,0);
        createGraph(adjilist,3,2,0);
        createGraph(adjilist,4,1,0);

        printf("after create:\n");
        displayGraph(adjilist,nodeNum);
		//深度优先遍历
        DFT(adjilist,vertexStatusArr,nodeNum);
		system("pause");
        return 0;
}
//创建图,採取前插法
void createGraph(vnode *adjilist, int start, int end,int weight)
{
	adjilist[start].from=start;
	edgenode *p=new edgenode;
	p->to=end;
	p->weight=weight;
	p->next=adjilist[start].first;
	adjilist[start].first=p;
}
//打印存储的图
void displayGraph(vnode *adjilist,int nodeNum)
{
    int i,j;
	edgenode *p;
    for(i=0;i<nodeNum;i++)
	{
		p=adjilist[i].first;
		while(p)
		{
			cout<<'('<<adjilist[i].from<<','<<p->to<<')'<<endl;
			p=p->next;
		}
     }
}
//深度优先遍历
void DFT(vnode *adjilist, int* vertexStatusArr,int nodeNum)
{
        printf("start BFT graph:\n");
        int i;
        for(i=0;i<nodeNum;i++){
                DFTcore(adjilist,i,vertexStatusArr);
        }
        printf("\n");
}
void DFTcore(vnode *adjilist,int i,int* vertexStatusArr)
{
    if(vertexStatusArr[i] == 1)
        return;
    printf("%d ",i);
    vertexStatusArr[i] = 1;
	edgenode *p;
    for(p=adjilist[i].first;p;p=p->next)
	{
        DFTcore(adjilist, p->to, vertexStatusArr);    
    }
}

时间复杂度O(V+E)。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4745300.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值