zoukankan      html  css  js  c++  java
  • 算法笔记-图-图的遍历

    深度优先遍历(DFS)

    邻接表(DFS)

    #include <iostream>
    #include <vector>
    using namespace std;
    const int maxn=10;
    vector<int> g[maxn];
    int n,vis[maxn];
    void dfs(int v, int h) {
    	vis[v]=1;
    	// 层级相关处理,或者对当前访问顶点的处理
    	for(int i=0; i<g[v].size(); i++) {
    		if(vis[g[v][i]]==0) {
    			dfs(g[v][i],h+1);
    		}
    	}
    }
    void dfs_travel() {
    	for(int i=0; i<n; i++) {
    		if(vis[i]==0) {
    			dfs(i,1); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=0;i<n;i++){
    		scanf("%d %d",&a,&b);
    		g[a].push_back(b);
    		g[b].push_back(a);
    	}
    	dfs_travel();
    	return 0;
    }
    

    邻接矩阵(DFS)

    #include <iostream>
    #include <vector>
    using namespace std;
    const int maxn=10;
    int g[maxn][maxn];
    int n,vis[maxn];
    void dfs(int v, int h) {
    	vis[v]=1;
    	// 层级相关处理,或者对当前访问顶点的处理
    	for(int i=1; i<=n; i++) {
    		if(g[v][i]==1 && vis[i]==0) {
    			dfs(i, h+1);
    		}
    	}
    }
    void dfs_travel() {
    	for(int i=1; i<=n; i++) {
    		if(vis[i]==0) {
    			dfs(i,1); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=1; i<=n; i++) { //顶点编号从1开始 
    		scanf("%d %d",&a,&b);
    		g[a][b]=1;
    		g[b][a]=1;
    	}
    	dfs_travel();
    	return 0;
    }
    

    广度优先遍历(BFS)

    邻接表(BFS 无层级统计)

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn=10;
    vector<int> g[maxn];
    int n,vis[maxn];
    void bfs(int v) {
    	queue<int> q;
    	q.push(v);
    	vis[v]=1;
    	while(!q.empty()){
    		int w = q.front();
    		q.pop();
                    // 层级相关处理,或者对当前访问顶点的处理
    		for(int i=0;i<g[w].size();i++){
    			if(vis[g[w][i]]==0){
    				q.push(g[w][i]);
    				vis[g[w][i]]=1; 
    			}
    		}
    	}
    }
    void bfs_travel() {
    	for(int i=0; i<n; i++) {
    		if(vis[i]==0) {
    			bfs(i); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=0;i<n;i++){
    		scanf("%d %d",&a,&b);
    		g[a].push_back(b);
    		g[b].push_back(a);
    	}
    	bfs_travel();
    	return 0;
    }
    

    邻接表(BFS 含层级统计)

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn=10;
    vector<int> g[maxn];
    int n,vis[maxn];
    struct node{
    	int v;
    	int h; 
    };
    void bfs(int v) {
    	queue<node> q;
    	q.push({v,1}); //初始层级为1 
    	vis[v]=1;
    	while(!q.empty()){
    		node w = q.front();
    		q.pop();
                    // 层级相关处理,或者对当前访问顶点的处理
    		for(int i=0;i<g[w.v].size();i++){
    			if(vis[g[w.v][i]]==0){
    				q.push({g[w.v][i],w.h+1});
    				vis[g[w.v][i]]=1; 
    			}
    		}
    	}
    }
    void bfs_travel() {
    	for(int i=0; i<n; i++) {
    		if(vis[i]==0) {
    			bfs(i); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=0;i<n;i++){
    		scanf("%d %d",&a,&b);
    		g[a].push_back(b);
    		g[b].push_back(a);
    	}
    	bfs_travel();
    	return 0;
    }
    

    邻接矩阵(BFS 无层级统计)

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn=10;
    int g[maxn][maxn];
    int n,vis[maxn];
    void bfs(int v) {
    	queue<int> q;
    	q.push(v);
    	vis[v]=1;
    	while(!q.empty()) {
    		int w = q.front();
    		q.pop();
                    // 层级相关处理,或者对当前访问顶点的处理
    		for(int i=1; i<=n; i++) {
    			if(g[w][i]==1 && vis[i]==0) {
    				q.push(i);
    				vis[i]=1;
    			}
    		}
    	}
    }
    void bfs_travel() {
    	for(int i=1; i<=n; i++) {
    		if(vis[i]==0) {
    			bfs(i); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=1; i<=n; i++) { //顶点编号从1开始
    		scanf("%d %d",&a,&b);
    		g[a][b]=1;
    		g[b][a]=1;
    	}
    	bfs_travel();
    	return 0;
    }
    

    邻接矩阵(BFS 含层级统计)

    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn=10;
    int g[maxn][maxn];
    int n,inq[maxn];
    struct node {
    	int v;
    	int h;
    };
    void bfs(int v) {
    	queue<node> q;
    	q.push({v,1}); //初始层级为1
    	inq[v]=1;
    	while(!q.empty()) {
    		node w = q.front();
    		q.pop();
    		// 层级相关处理,或者对当前访问顶点的处理
    		for(int i=1; i<=n; i++) {
    			if(g[w.v][i]==1 && inq[i]==0) {
    				q.push({i,w.h+1});
    				inq[i]=1;
    			}
    		}
    	}
    }
    void bfs_travel() {
    	for(int i=1; i<=n; i++) {
    		if(inq[i]==0) {
    			bfs(i); //起始高度假设为1
    			// 统计连通分量
    		}
    	}
    }
    int main(int argc,char * argv[]) {
    	scanf("%d",&n);
    	int a,b;
    	for(int i=1; i<=n; i++) {
    		scanf("%d %d",&a,&b);
    		g[a][b]=1;
    		g[b][a]=1;
    	}
    	bfs_travel();
    	return 0;
    }
    
  • 相关阅读:
    Insert Buffering
    B-Tree vs LSM-tree
    MySQL 5.6 死锁演示 及 日志分析
    MySQL索引
    InnoDB的三个关键特性
    MySQL如何优化GROUP BY :松散索引扫描 VS 紧凑索引扫描
    MySql 自适应哈希索引
    母牛的故事
    简单的java程序
    一些变量的比较
  • 原文地址:https://www.cnblogs.com/houzm/p/12370470.html
Copyright © 2011-2022 走看看