邻接表实现DFS和BFS

题目

用邻接表存储下图 ,并实现BFS和DFS。

解题思路

这是一个带权无向图,题目要求用一个邻接表存储,可以是一个链表数组,但本题采用C++STL中的multimap实现。把一个char字符与一个结构体节点进行映射,形成多个映射。每个结构体节点包括一个char类型的数据和一个int类型的权。这里采用char字符是为了使节点更加常规化。

再采用BFS和DFS对该表从0节点开始做一个遍历,思路也比较简单。

代码如下:

node.h

#include<iostream>
typedef struct Node {
	char data;
	int weight;
}Node;

Graph.h

#pragma once
#include"Node.h"
#include<stdlib.h>
#include<map>
#include<queue>
using namespace std;
class Graph
{
public:
	void Create();
	void Print();
	void DFSTraverse();
	void BFSTraverse();
private:
	multimap<char, Node> m;
	bool DFSvisited[6];  //用于深搜的标记数组
	bool BFSvisited[6];  //用于广搜的标记数组
	void DFS(int num);
};

Graph.cpp

#include "Graph.h"
void Graph::Create()
{
	Node p1, p2, p3, p4, p5, p6, p7, p8, p9, p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20;
	p1.data = '1'; p1.weight = 6;
	p2.data = '3'; p2.weight = 4; 
	p3.data = '0'; p3.weight = 6;
	p4.data = '2'; p4.weight = 5;
	p5.data = '3'; p5.weight = 7;
	p6.data = '4'; p6.weight = 7;
	p7.data = '1'; p7.weight = 10;
	p8.data = '3'; p8.weight = 8;
	p9.data = '4'; p9.weight = 5;
	p10.data = '5'; p10.weight = 6;
	p11.data = '0'; p11.weight = 4;
	p12.data = '1'; p12.weight = 7;
	p13.data = '2'; p13.weight = 8;
	p14.data = '4'; p14.weight = 12;
	p15.data = '1'; p15.weight = 7;
	p16.data = '2'; p16.weight = 5;
	p17.data = '3'; p17.weight = 12;
	p18.data = '5'; p18.weight = 7;
	p19.data = '2'; p19.weight = 6;
	p20.data = '4'; p20.weight = 7;
	m.insert(pair<char,Node>('0',p1));
	m.insert(pair<char, Node>('0', p2));
	m.insert(pair<char, Node>('1', p3));
	m.insert(pair<char, Node>('1', p4));
	m.insert(pair<char, Node>('1', p5));
	m.insert(pair<char, Node>('1', p6));
	m.insert(pair<char, Node>('2', p7));
	m.insert(pair<char, Node>('2', p8));
	m.insert(pair<char, Node>('2', p9));
	m.insert(pair<char, Node>('2', p10));
	m.insert(pair<char, Node>('3', p11));
	m.insert(pair<char, Node>('3', p12));
	m.insert(pair<char, Node>('3', p13));
	m.insert(pair<char, Node>('3', p14));
	m.insert(pair<char, Node>('4', p15));
	m.insert(pair<char, Node>('4', p16));
	m.insert(pair<char, Node>('4', p17));
	m.insert(pair<char, Node>('4', p18));
	m.insert(pair<char, Node>('5', p19));
	m.insert(pair<char, Node>('5', p20));
}
void Graph::Print()
{
	multimap<char,Node>::iterator i, iend;
	iend = m.end();
	for (i = m.begin(); i != iend; i++)
	{
		cout << (*i).first << " " << (*i).second.data<<","<<(*i).second.weight<<endl;
	}
}
void Graph::DFS(int num)
{
	DFSvisited[num] = true;
	multimap<char, Node>::iterator p=m.find('0'+num);
	cout << (*p).first<<" ";
	multimap<char, Node>::size_type sum = m.count('0' + num);
	for (; sum > 0; sum--, p++)
	{
		if (!DFSvisited[(*p).second.data - '0'])
			DFS((*p).second.data - '0');
	}
}
void Graph::DFSTraverse()
{
	for (int i = 0; i < 6; i++)
		DFSvisited[i] = false;
	for (int i = 0; i < 6; i++)
	{
		if (!DFSvisited[i])
			DFS(i);
	}
}
void Graph::BFSTraverse()
{
	queue<int>q;
	for (int num = 0; num < 6; num++)
		BFSvisited[num] = false;
	for (int num = 0; num < 6; num++)
	{
		if (!BFSvisited[num])
		{
			BFSvisited[num] = true;
			multimap<char, Node>::iterator p = m.find('0' + num);
			cout << (*p).first << " ";
			q.push(num);
			while (!q.empty())
			{
				int t = q.front();
				q.pop();
				multimap<char, Node>::iterator p1 = m.find('0' + t);
				multimap<char, Node>::size_type sum1 = m.count('0' + t);
				for (; sum1 > 0; sum1--, p1++)
				{
					if (!BFSvisited[(*p1).second.data - '0'])
					{
						BFSvisited[(*p1).second.data - '0'] = true;
						multimap<char, Node>::iterator p2 = m.find((*p1).second.data);
						cout << (*p2).first<<" ";
						q.push((*p1).second.data - '0');
					}
				}
			}
		}
	}
}

main.cpp

#include"Graph.h"
int main()
{
	Graph g;
	g.Create();
	g.Print();
	g.DFSTraverse();
	cout << endl;
	g.BFSTraverse();
	return 0;
}

代码不足之处

思前想后也没有想出来输入的部分应该怎么简化呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值