目录
存储结构
邻接矩阵
邻接表
图的遍历
深度优先遍历
bool edg[100][100];
bool visited[100];
memset(edg, 0, sizeof(edg));
memset(visited, 0, sizeof(visited));
vector<int> result;
int num;//节点个数
void DFS(int u)//u为节点下标
{
visited[u] = true;
result.push_back(u);
for (int i = 0;i < num;i++)
{
if (visited[i] == false&&edg[i][u]==true)
//当i节点未被访问且i节点与该节点u存在边时
DFS(i);
}
}
//得到的result序列即为按DFS遍历的顺序结果
广度优先遍历
bool edg[100][100];
bool visited[100];
memset(edg, 0, sizeof(edg));
memset(visited, 0, sizeof(visited));
vector<int> result;
int num, E;
void BFS(int p)
{
queue<int> q;
int i;
q.push(p);
visited[p] = true;
while (!q.empty())
//按照队列中的顺序,访问完一个节点其所有相连的节点后
//再按顺序访问与其子节点相连的节点...直到访问完所有节点,队列为空
{
int s = q.front();
q.pop();
result.push_back(s);
for (i = 0;i < num;i++)
{
if (visited[i] == false && edg[i][s] == true)
//在所有节点中找到未被访问过的且与当前result中最后一个节点s有边相连的节点
{
q.push(i);
visited[i] = true;
//放入队列中,标记为已访问
}
}
}
}
相关算法及其应用
最短路径——Dijkstra算法、Floyd算法
最小生成树——Prime算法、Kruscal算法