• 算法笔记-图-图的遍历


    深度优先遍历(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;
    }
    
  • 相关阅读:
    eclipse中的TODO和FIXME
    使用mui框架后a标签无法跳转
    java.lang.OutOfMemoryError: Java heap space异常
    mysql中表触发器的简单使用
    编写第一个 Java 程序
    QDialog类exec()与show()的区别
    Qt中信号槽connect的多种类型
    2.3 UML活动图
    2.2 UML用例模型
    2.1 uml序言
  • 原文地址:https://www.cnblogs.com/houzm/p/12370470.html
Copyright © 2020-2023  润新知