目錄
存儲結構
鄰接矩陣
鄰接表
圖的遍歷
深度優先遍歷
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算法