这里只打一遍算法笔记上的邻接表版和邻接矩阵版
DFS
伪代码
DFS(u){vis[u] = true;for(从u出发能到达的所有顶点v){if(vis[v] = false) DFS(v)}}DFSTrave(G){for(G的所有顶点u){if(vis[u] == false) DFS(u)}}
邻接矩阵版
const int maxv = 1000;const int INF = 1000000000;int n, G[maxv][maxv];bool vis[maxv] = {false};void DFS(int u, int depth){vis[u] = true;//一些操作for(int v = 0; v < n; v++){if(vis[v] == false && G[u][v] != INF){DFS(v, depth + 1);}}}void DFSTrave(){for(int u = 0; u < n; u++){if(vis[u] == false){DFS(u, 1)}}}
邻接表版
vector<int> Adj[maxn];int n;bool vis[maxn] = {false};void DFS(int u, int depth){vis[u] = true;for(int i = 0; i < Adj[u].size(); i++){int v = Adj[u][i];if(vis[v] == false){DFS(v, depth + 1);}}}void DFSTrave(){for(int u = 0; u < n; u++){if(vis[u] == false){DFS(u, 1);}}}
BFS
伪代码
BFS(u){queue q;inq[u] = true;while(q非空){for(从u出发可到达的所有顶点v)if(inq[v] == false){inq[v] = true;q.push(v);}}}BFSTrave(G){for(G的所有顶点u){if(inq[u] == false){BFS(u);}}}
邻接矩阵版
int n, G[maxn][maxn];bool inq[maxn] = {false};void BFS(int u){queue<int> q;q.push(u);inq[u] = true;while(!q.empty()){int u = q.front();q.pop();for(int v = 0; v < n; i++){if(inq[v] == false && G[u][v] != INF){q.push(v);inq[v] = true;}}}}void BFSTrave(){for(int u = 0; u < n; u++){if(inq[u] == false){BFS(q);}}}
邻接表版
vector<int> Adj[maxn];int n;bool inq[maxn] = {false};void BFS(int u){queue<int> q;q.push(u);inq[u] = true;while(!q.empty()){int u = q.front();q.pop();for(int i = 0; i < Adj[u].size(); i++){int v = Adj[u][i];if(inq[v] == false){q.push(v);inq[v] = true;}}}}void BFSTrave(){for(int i = 0; i < n; i++){if(inq[i] == false){BFS(i);}}}
求该连通块其他顶点的层号
struct Node{int v;int layer;};vector<Node> Adj[N];void BFS(int s){queue<Node> q;Node start;start.v = s;start.layer = 0;q.push(start);inq[start.v] = true;while(!q.empty()){Node topNode = q.front();q.pop();int u = topNode.v;for(int i = 0; i < Adj[u].size(); i++){Node next = Adj[u][i];next.layer = topNode.layer + 1;if(inq[next.v] == false){q.push(next);inq[next.v] = true;}}}}
