鏈式前向星寫法下的DFS和BFS
阿新 • • 發佈:2018-07-11
con img printf init 無向圖 while str 想是 區別
Input
5 7
1 2
2 3
3 4
1 3
4 1
1 5
4 5
output
1 5 3 4 2
#include<bits/stdc++.h> using namespace std; const int maxn = 150; const int maxm = 1050; int n, m;//頂點數,邊數 int head[maxm], tot; bool used[maxn]; //head[u]表示已知的最後一條以u為起點的邊在邊集e中的下標 struct edge { int to, next; //e[i].to表示邊的終點,e[i].next表示上一條和邊e[i]起點相同的點在e中的下標 //int w;權值 }e[maxm];//邊集 void init() { tot = 0; memset(head, -1, sizeof(head)); memset(used, 0, sizeof(used)); } void add(int u, int v) {//在圖中加邊 //e[tot].w = w e[tot].to = v; e[tot].next = head[u]; head[u] = tot++; } void dfs(int u) { used[u] = 1; printf("%d ", u); for (int i = head[u]; i != -1; i = e[i].next) {//遍歷的方式 int v = e[i].to; if (!used[v]) dfs(v); } } int main() { while (scanf("%d%d", &n, &m) == 2) { init(); for (int i = 1; i <= m; ++i) { int from, to; scanf("%d%d", &from, &to); add(from, to); //add(to, from)無向圖 } for (int i = 1; i <= n; ++i) { if (!used[i] && head[i] != -1) dfs(i); } printf("\n"); } return 0; } /* 5 7 1 2 2 3 3 4 1 3 4 1 1 5 4 5 1 5 3 4 2 */
鏈式前向星和鄰接表的思想是一樣的,
區別就是:鄰接表是用鏈表實現的,可以動態的增加邊;
而鏈式前向星是用結構體數組實現的,是靜態的,需要一開始知道數據範圍,開好數組大小。
相比之下,鄰接表靈活,鏈式前向星好寫。
鏈式前向星寫法下的DFS和BFS