您的位置:首页 > 其它

通过BFS 和 DFS两种方法找无向图的连通分量

2015-12-20 14:10 776 查看
class Solution {
public:
/**
* @param nodes a array of Undirected graph node
* @return a connected set of a Undirected graph
*/
// BFS
vector<vector<int>> connectedSet1(vector<UndirectedGraphNode*>& nodes) {
// Write your code here
vector<vector<int>> result;
unordered_map<UndirectedGraphNode *, bool> map;// if visited or not

for(UndirectedGraphNode * node : nodes){
if(map.find(node) != map.end()){
continue;
}

queue<UndirectedGraphNode*> q;
q.push(node);
map[node] = true;

vector<int> row;// 一个子图 或者说 一个group节点
while(!q.empty()){
UndirectedGraphNode * now = q.front();
q.pop();
row.push_back(now->label);

for(int j = 0; j < now->neighbors.size(); j++){
UndirectedGraphNode * neighbor = now->neighbors[j];
if(map.find(neighbor) == map.end()){
q.push(neighbor);
map[neighbor] = true;
}
}
}
sort(row.begin(), row.end());// this is optional to make it nice looking
result.push_back(row);
}
return result;
}

// DFS
vector<vector<int>> connectedSet(vector<UndirectedGraphNode*>& nodes) {
vector<vector<int>> result;
int n = nodes.size();
unordered_map<UndirectedGraphNode*, bool> visited;
for(auto node : nodes){
vector<int> component;
dfs(component, node, visited);
if(component.size() > 0){
sort(component.begin(), component.end());// this is optional to make it nice looking
result.push_back(component);
}
}
return result;
}
void dfs(vector<int> &component,
UndirectedGraphNode* now,
unordered_map<UndirectedGraphNode*, bool> &visited){

if(visited.find(now) != visited.end() && visited[now]){
return;
}
visited[now] = true;
component.push_back(now->label);

for(auto nb : now->neighbors){
dfs(component, nb, visited);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DFS BFS