算法筆記-圖-圖的遍歷


深度優先遍歷(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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM