图的数据结构常见有5种:
1.邻接矩阵2.邻接表3.十字链表4.邻接多重表5.边集数组
其中邻接矩阵与邻接表较为常用,可根据所研究图的结构(顶点与边)与算法复杂度进行选择。
图的常见问题及算法有下面几种:
1.DFS(邻接矩阵、邻接表)
深度优先遍历采用递归思想,逐渐深入,采用visited[ ]数组记录顶点是否被探索。
邻接矩阵:
#include <iostream>
using namespace std;
#define MAXVEX 100
#define MAXEDGE 100
#include <queue>
#include <stack>
class Graph
{
private:
int G[MAXVEX][MAXVEX];
int numvex;
int numedge;
bool visited[MAXVEX];
public:
void DFS(int i);
void DFSTraverse();
void BFS();
void Prim();
void Kruskal();
void Find(int *parent, int f);
void Dijkstra();
void Floyd();
};
void Graph::DFS(int i)
{
visited[i] = true;
for (int j = 0; j < numvex; j++)
{
if (visited[j] == false && G[i][j] == 1)
DFS(j);
}
}
void Graph::DFSTraverse()
{//初始化visited数组
for (int i = 0; i < numvex; i++)
{
visited[i] = false;
}
for (int i = 0; i < numvex; i++)
{//从每个顶点开始深度遍历
if (visited[i] == false)
DFS(i);
}
}
邻接表:
void Graph::DFS(int i)
{
visited[i] = true;
EdgeNode *e = G[i].firstedge;
while (e)
{
if (visited[e->adjvex] == false)
{
DFS(e->adjvex);
}
e = e->next;
}
}
void Graph::DFSTraverse()
{
for (int i