DFS遍历图

 
 
//DFS遍历有向图
//采用十字链表存储结构  
//2017.3.30
//lovesunmoonlight 
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<queue>

using namespace std;

#define MAX_VERTEX_NUM 20

struct ArcBox;

queue<int> order;
 
//表头结点 
typedef struct VexNode
{
	ArcBox *firstin,*firstout;
	double data;
}VexNode;

//边结点 
typedef struct ArcBox
{
	int tailvex,headvex;
	ArcBox *hlink,*tlink; //hlink指向head相同的下一条边,tlink指向tail相同的下一条边 
	double data;
}ArcBox;

//图定义
typedef struct
{
	VexNode xlist[MAX_VERTEX_NUM]; //表头数组 
	int vexnum,arcnum; //顶点数和边数 
}OLGraphy; 

//初始化图 
void initialGraphy(OLGraphy& g,int vexnum,int arcnum)
{
	g.vexnum=vexnum;
	g.arcnum=arcnum;
	for(int i=0;i<g.vexnum;i++)
	{
		g.xlist[i].data=rand()%50;
		g.xlist[i].firstin=NULL;
		g.xlist[i].firstout=NULL;
		cout<<"结点编号:"<<i+1<<"  结点数据:"<<g.xlist[i].data<<endl;
	}
	cout<<endl;
	int etail,ehead;
	cout<<"请输入边的信息,包括起点,终点: \n";
	for(int i=0;i<g.arcnum;i++)
	{
		cout<<"第"<<i+1<<"条边:\n"; 
		cout<<"起点:"; 
		cin>>etail;
		cout<<"终点:"; 
		cin>>ehead;
		--etail;
		--ehead;
		ArcBox* p=(ArcBox*)malloc(sizeof(ArcBox));
		p->tailvex=etail;
		p->headvex=ehead;
		
		//指向当前顶点的第一条出边和入边 
		p->hlink=g.xlist[ehead].firstin;
		p->tlink=g.xlist[etail].firstout;
		p->data=rand()%100; 
		
		//更新顶点的第一条出边和入边 
		g.xlist[ehead].firstin=p;
		g.xlist[etail].firstout=p;
	}
	 
} 

void DFS(const OLGraphy& g,int v,bool visited[])
{
	//完成当前节点的访问 
	visited[v]=true;
	order.push(v+1);
	cout<<"结点编号:"<<v+1<<"  结点数据:"<<g.xlist[v].data<<endl;
	
	ArcBox* temp1=g.xlist[v].firstin;
	ArcBox* temp2=g.xlist[v].firstout; 
	while(temp1)
	{
		int next=temp1->tailvex; //以v为头的边,遍历与之相连的结点 
		if(!visited[next])
			DFS(g,next,visited);
		temp1=temp1->hlink;
	}
	while(temp2)
	{
		int next=temp2->headvex; //以v为尾的边,遍历与之相连的结点 
		if(!visited[next])
			DFS(g,next,visited);
		temp2=temp2->tlink;
	}		
}
int main()
{
	OLGraphy g;
	int vexnum,arcnum;
	cout<<"输入顶点数和边数:\n";
	cout<<"顶点数:";
	cin>>vexnum;
	cout<<"边数:";
	cin>>arcnum;
	cout<<endl; 
	bool visited[MAX_VERTEX_NUM]={false};
	initialGraphy(g,vexnum,arcnum);
	cout<<"遍历结果:\n"; 
	DFS(g,0,visited);
	cout<<"最终的遍历顺序为:\n";
	int ans=order.front();
	order.pop();
	cout<<ans; 
	while(!order.empty())
	{
		int ans=order.front();
		order.pop();
		cout<<"->"<<ans;
	}
	cout<<endl;
	return 0;
} 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值