实验四——图论
要求:分别用深度优先与广度优先遍历找出图中连通图个数
代码
#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;
}

浙公网安备 33010602011771号