#ifndef COMPONENT_H
#define COMPONENT_H
#include <iostream>
#include <cassert>
using namespace std;
//图的深度优先遍历
template<typename Graph>
class Component{
private:
Graph &G;
bool *visited;
int ccount;
int *id;
void dfs(int v){
visited[v] = true;
id[v] = ccount;
typename Graph::adjIterator adj(G,v);
for(int i =adj.begin();!adj.end();i= adj.next()){
if(!visited[i])
dfs(i);
}
}
public:
Component(Graph &graph):G(graph){
visited = new bool[G.V()];
id = new int[G.V()];
ccount=0;
for(int i=0;i<G.V();i++){
visited[i]= false;
id[i] = -1;
}
for(int i =0;i<G.V();i++)
if(!visited[i]){
dfs(i);
ccount++;
}
}
~Component(){
delete[] visited;
delete[] id;
}
int count(){
return ccount;
}
bool isConnected(int v,int w){
assert(v>=0 && v<G.V());
assert(w>=0 && w<G.V());
return id[v] == id[w];
}
};
#endif