题目
用邻接表存储下图 ,并实现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;
}
代码不足之处
思前想后也没有想出来输入的部分应该怎么简化呢?