C++ 邻接表存储下判断无向图是否为树(DFS)

#include <bits/stdc++.h>
#define MaxSize 100

/*
* Created by HarvestWu on 2018/06/22.
*/

using namespace std;

typedef int ElemType;

//边表
typedef struct ArcNode
{
	int adjvex;                 //该边所指向的结点的位置
	struct ArcNode *nextarc;    //指向下一条边的指针
	int info;                   //
}ArcNode;

//顶点表
typedef struct
{
	char data;                  //顶点信息
	ArcNode *firstarc;          //指向第一条边的指针
}VNode;

//邻接表
typedef struct
{
	VNode adjlist[MaxSize];
	int n, e;                    //顶点数、边数
}AGraph;                        //图的邻接表类型

void Visit(int v)
{
	cout << v << " ";
}

//图的深度优先搜索遍历(DFS)
//假设用邻接表作为图的存储结构

int visit[MaxSize] = { 0 };
void DFS(AGraph *G, int v,int &vn,int &en)
{
	ArcNode *p;
	visit[v] = 1;					//置标志位1代表已访问
	++vn;							//顶点计数
	p = G->adjlist[v].firstarc;		//p指向顶点v的第一条边
	while (p != NULL)
	{
		++en;						//边计数
		if (visit[p->adjvex] == 0)	//未访问则递归访问
			DFS(G, p->adjvex, vn, en);
		p = p->nextarc;				
	}

}

//创建无向图的邻接表
void createAGraph(AGraph *&AG)
{
	
	int i, j, k;
	ArcNode *q;
	cout << "输入顶点数、边数:" << endl;
	cin >> AG->n >> AG->e;
	for (i = 0; i<AG->n; i++)
	{
		AG->adjlist[i].data = i;
		AG->adjlist[i].firstarc = NULL;
	}
	cout << "输入边(vi,vj)的顶点序号i,j:" << endl;
	for (k = 0; k<AG->e; ++k)
	{
		cin >> i >> j;
		//头插法
		q = (ArcNode*)malloc(sizeof(ArcNode));
		q->adjvex = j;
		q->nextarc = AG->adjlist[i].firstarc;
		AG->adjlist[i].firstarc = q;

		q = (ArcNode*)malloc(sizeof(ArcNode));
		q->adjvex = i;
		q->nextarc = AG->adjlist[j].firstarc;
		AG->adjlist[j].firstarc = q;
	}
}

//判断无向图G是否一颗树
int main()
{
	int vn=0, en=0;//记录顶点数、边数
	AGraph *AG;
	AG = (AGraph*)malloc(sizeof(AGraph));
	createAGraph(AG);
	DFS(AG, 0, vn, en);
	if (vn == AG->n && (AG->n - 1) == en / 2)
		cout << "True" << endl;
	else cout << "False" << endl;
	return 0;
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值