实验四——图论

要求:分别用深度优先与广度优先遍历找出图中连通图个数

代码

#include <bits/stdc++.h>
#include <string>
#define SOURCEADDRESS "C:\\Users\\***\\OneDrive\\Desktop\\graph\\graph\\00500-075.txt"
using namespace std;

vector<vector<char> > readFromFile(const char * sourceAddress){
	//open file
	FILE * f = fopen(sourceAddress, "r");
	if(f == NULL){
		cout << "file reading error" << endl;
		return vector<vector<char> >(10, vector<char>(10));
	}
	
	//read
	int n = 0;
	fscanf(f, "%d\n", &n);
	vector<vector<char> > adj(n, vector<char>(n));
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			fscanf(f, " %c", &adj[i][j]);
		}
	}
	
	//close file
	fclose(f);
	
	return adj;
}

void bfs(int node, vector<vector<char> >&adj, vector<bool>& visited){
	queue<int> q;
	q.push(node);
	visited[node] = true;
	
	while(!q.empty()){
		int tem = q.front();
		q.pop();
		for(int i = 0; i < adj.size(); i++){
			if(adj[tem][i] == '1' && !visited[i]){
				q.push(i);
				visited[i] = true;
			}
		}
	}
}
 
void dfs(int node, vector<vector<char> >&adj, vector<bool>& visited){
	visited[node] = true;
	for(int i = 0; i < adj.size(); i++){
		if(adj[node][i] == '1' && !visited[i]){
			dfs(i, adj, visited);
		}
	}
}

int main(){
	//read graph 
	vector<vector<char> > adj = readFromFile(SOURCEADDRESS);
	 vector<vector<char> > adj = {
         {'0', '1', '0', '0', '0'},
         {'1', '0', '0', '0', '0'},
         {'0', '0', '1', '0', '0'},
         {'0', '0', '0', '0', '1'},
         {'0', '0', '0', '1', '0'}
     };
	//dfs
	vector<bool> visited(adj.size(), false);
	int ans = 0;
	for(int i = 0; i < adj.size(); i++){
		if(!visited[i]){
			ans++;
			dfs(i, adj, visited);
			// bfs(i, adj, visited);
		}
	}
	
	cout << "components of number: " << ans << endl;
	
	return 0;
}
posted @ 2024-12-11 15:14  luvmis  阅读(29)  评论(0)    收藏  举报