这里只打一遍算法笔记上的邻接表版和邻接矩阵版

DFS

伪代码

  1. DFS(u){
  2. vis[u] = true;
  3. for(从u出发能到达的所有顶点v){
  4. if(vis[v] = false) DFS(v)
  5. }
  6. }
  7. DFSTrave(G){
  8. for(G的所有顶点u){
  9. if(vis[u] == false) DFS(u)
  10. }
  11. }

邻接矩阵版

  1. const int maxv = 1000;
  2. const int INF = 1000000000;
  3. int n, G[maxv][maxv];
  4. bool vis[maxv] = {false};
  5. void DFS(int u, int depth){
  6. vis[u] = true;
  7. //一些操作
  8. for(int v = 0; v < n; v++){
  9. if(vis[v] == false && G[u][v] != INF){
  10. DFS(v, depth + 1);
  11. }
  12. }
  13. }
  14. void DFSTrave(){
  15. for(int u = 0; u < n; u++){
  16. if(vis[u] == false){
  17. DFS(u, 1)
  18. }
  19. }
  20. }

邻接表版

  1. vector<int> Adj[maxn];
  2. int n;
  3. bool vis[maxn] = {false};
  4. void DFS(int u, int depth){
  5. vis[u] = true;
  6. for(int i = 0; i < Adj[u].size(); i++){
  7. int v = Adj[u][i];
  8. if(vis[v] == false){
  9. DFS(v, depth + 1);
  10. }
  11. }
  12. }
  13. void DFSTrave(){
  14. for(int u = 0; u < n; u++){
  15. if(vis[u] == false){
  16. DFS(u, 1);
  17. }
  18. }
  19. }

BFS

伪代码

  1. BFS(u){
  2. queue q;
  3. inq[u] = true;
  4. while(q非空){
  5. for(从u出发可到达的所有顶点v)
  6. if(inq[v] == false){
  7. inq[v] = true;
  8. q.push(v);
  9. }
  10. }
  11. }
  12. BFSTrave(G){
  13. for(G的所有顶点u){
  14. if(inq[u] == false){
  15. BFS(u);
  16. }
  17. }
  18. }

邻接矩阵版

  1. int n, G[maxn][maxn];
  2. bool inq[maxn] = {false};
  3. void BFS(int u){
  4. queue<int> q;
  5. q.push(u);
  6. inq[u] = true;
  7. while(!q.empty()){
  8. int u = q.front();
  9. q.pop();
  10. for(int v = 0; v < n; i++){
  11. if(inq[v] == false && G[u][v] != INF){
  12. q.push(v);
  13. inq[v] = true;
  14. }
  15. }
  16. }
  17. }
  18. void BFSTrave(){
  19. for(int u = 0; u < n; u++){
  20. if(inq[u] == false){
  21. BFS(q);
  22. }
  23. }
  24. }

邻接表版

  1. vector<int> Adj[maxn];
  2. int n;
  3. bool inq[maxn] = {false};
  4. void BFS(int u){
  5. queue<int> q;
  6. q.push(u);
  7. inq[u] = true;
  8. while(!q.empty()){
  9. int u = q.front();
  10. q.pop();
  11. for(int i = 0; i < Adj[u].size(); i++){
  12. int v = Adj[u][i];
  13. if(inq[v] == false){
  14. q.push(v);
  15. inq[v] = true;
  16. }
  17. }
  18. }
  19. }
  20. void BFSTrave(){
  21. for(int i = 0; i < n; i++){
  22. if(inq[i] == false){
  23. BFS(i);
  24. }
  25. }
  26. }

求该连通块其他顶点的层号

  1. struct Node{
  2. int v;
  3. int layer;
  4. };
  5. vector<Node> Adj[N];
  6. void BFS(int s){
  7. queue<Node> q;
  8. Node start;
  9. start.v = s;
  10. start.layer = 0;
  11. q.push(start);
  12. inq[start.v] = true;
  13. while(!q.empty()){
  14. Node topNode = q.front();
  15. q.pop();
  16. int u = topNode.v;
  17. for(int i = 0; i < Adj[u].size(); i++){
  18. Node next = Adj[u][i];
  19. next.layer = topNode.layer + 1;
  20. if(inq[next.v] == false){
  21. q.push(next);
  22. inq[next.v] = true;
  23. }
  24. }
  25. }
  26. }