📄 graph.cc
字号:
// Invert to pre-visit nodes which can't be reached.
transform(visited.begin(), visited.end(), visited.begin(),
logical_not<big_bool>());
vec[start] = 0;
max_depth_recurse(vec, visited, start, reverse_i);
return vec;
}
/*===========================================================================*/
const RVector<int>
RawGraph::max_depth(const RVector<vertex_index> & start,
bool reverse_i) const {
// Warning: This method has not been well-tested.
Rabort();
RVector<int> vec(vertex_.size(), -1);
RVector<big_bool> visited(vertex_.size(), false);
RVector<vertex_index> scratch;
MAP(x, start.size())
dfs_recurse(scratch, visited, start[x], reverse_i);
scratch.erase(scratch.begin(), scratch.end());
transform(visited.begin(), visited.end(), visited.begin(),
logical_not<big_bool>());
MAP(x, start.size()) {
vec[start[x]] = 0;
max_depth_recurse(vec, visited, start[x], reverse_i);
}
return vec;
}
/*===========================================================================*/
void RawGraph::self_check() const {
MAP(x, vertex_.size())
Rassert(vertex_offset(&vertex_[x]) < size_vertex());
MAP(x, edge_.size()) {
Rassert(edge_[x].to_ < size_vertex());
Rassert(edge_[x].from_ < size_vertex());
}
MAP(x, vertex_.size()) {
MAP(y, vertex_[x].out_.size()) {
Rassert(vertex_[x].out_[y] < size_edge());
}
MAP(y, vertex_[x].in_.size()) {
Rassert(vertex_[x].in_[y] < size_edge());
}
}
}
/*===========================================================================*/
bool RawGraph::cyclic_recurse(RVector<big_bool> & visited,
const vertex_index start, const vertex_index branch) const {
visited[branch] = true;
MAP(x, vertex(branch)->out_.size()) {
vertex_index to_vertex = edge(vertex(branch)->out_[x])->to_;
if (to_vertex == start)
return true;
if (! visited[to_vertex])
if (cyclic_recurse(visited, start, to_vertex))
return true;
}
return false;
}
/*===========================================================================*/
void RawGraph::dfs_recurse(RVector<vertex_index> & vec,
RVector<big_bool> & visited, const vertex_index branch,
bool reverse_i) const {
visited[branch] = true;
vec.push_back(branch);
if (reverse_i) {
MAP(x, vertex(branch)->in_.size()) {
vertex_index next_index = edge(vertex(branch)->in_[x])->from_;
if (! visited[next_index]) {
dfs_recurse(vec, visited, next_index, reverse_i);
}
}
} else {
MAP(x, vertex(branch)->out_.size()) {
vertex_index next_index = edge(vertex(branch)->out_[x])->to_;
if (! visited[next_index]) {
dfs_recurse(vec, visited, next_index, reverse_i);
}
}
}
}
/*===========================================================================*/
void RawGraph::bfs_recurse(RVector<vertex_index> & vec,
RVector<big_bool> & visited, const vertex_index branch,
bool reverse_i) const {
RVector<vertex_index> stack;
if (reverse_i) {
MAP(x, vertex(branch)->in_.size()) {
vertex_index next_index = edge(vertex(branch)->in_[x])->from_;
if (! visited[next_index]){
visited[next_index] = true;
vec.push_back(next_index);
stack.push_back(next_index);
}
}
} else {
MAP(x, vertex(branch)->out_.size()) {
vertex_index next_index = edge(vertex(branch)->out_[x])->to_;
if (! visited[next_index]){
visited[next_index] = true;
vec.push_back(next_index);
stack.push_back(next_index);
}
}
}
MAP(x, stack.size()) {
bfs_recurse(vec, visited, stack[x], reverse_i);
}
}
/*===========================================================================*/
void RawGraph::top_sort_recurse(RVector<vertex_index> & vec,
RVector<big_bool> & visited, const vertex_index branch,
bool reverse_i) const {
// If any of the parents haven't been visited yet, stop exploring this path.
if (reverse_i) {
MAP(x, vertex(branch)->out_.size())
if (! visited[edge(vertex(branch)->out_[x])->to_])
return;
} else {
MAP(x, vertex(branch)->in_.size())
if (! visited[edge(vertex(branch)->in_[x])->from_])
return;
}
visited[branch] = true;
vec.push_back(branch);
if (reverse_i) {
MAP(x, vertex(branch)->in_.size()) {
vertex_index next_index = edge(vertex(branch)->in_[x])->from_;
if (! visited[next_index])
top_sort_recurse(vec, visited, next_index, reverse_i);
}
} else {
MAP(x, vertex(branch)->out_.size()) {
vertex_index next_index = edge(vertex(branch)->out_[x])->to_;
if (! visited[next_index])
top_sort_recurse(vec, visited, next_index, reverse_i);
}
}
}
/*===========================================================================*/
void RawGraph::outward_crawl_recurse(RVector<vertex_index> & vec,
RVector<big_bool> & visited, vertex_index branch) const {
RVector<vertex_index> stack;
MAP(x, vertex(branch)->in_.size()) {
vertex_index next_index = edge(vertex(branch)->in_[x])->from_;
if (! visited[next_index]){
visited[next_index] = true;
vec.push_back(next_index);
stack.push_back(next_index);
}
}
MAP(x, vertex(branch)->out_.size()) {
vertex_index next_index = edge(vertex(branch)->out_[x])->to_;
if (! visited[next_index]){
visited[next_index] = true;
vec.push_back(next_index);
stack.push_back(next_index);
}
}
MAP(x, stack.size()) {
outward_crawl_recurse(vec, visited, stack[x]);
}
}
/*===========================================================================*/
void RawGraph::max_depth_recurse(RVector<int> & vec,
RVector<big_bool> & visited, const vertex_index branch,
bool reverse_i) const {
// If any of the parents haven't been visited yet, stop exploring this path.
if (reverse_i) {
MAP(x, vertex(branch)->out_.size())
if (! visited[edge(vertex(branch)->out_[x])->to_])
return;
} else {
MAP(x, vertex(branch)->in_.size())
if (! visited[edge(vertex(branch)->in_[x])->from_])
return;
}
visited[branch] = true;
if (reverse_i) {
MAP(x, vertex(branch)->in_.size()) {
vertex_index next_index = edge(vertex(branch)->in_[x])->from_;
vec[next_index] = max(vec[next_index], vec[branch] + 1);
if (! visited[next_index])
max_depth_recurse(vec, visited, next_index, reverse_i);
}
} else {
MAP(x, vertex(branch)->out_.size()) {
vertex_index next_index = edge(vertex(branch)->out_[x])->to_;
vec[next_index] = max(vec[next_index], vec[branch] + 1);
if (! visited[next_index])
max_depth_recurse(vec, visited, next_index, reverse_i);
}
}
}
/*===========================================================================*/
void RawGraph::edge_type::print_to(ostream & os) const {
os << " from vertex " << from_ << " to vertex " << to_;
}
/*===========================================================================*/
comp_type
RawGraph::edge_type::comp(const self & et) const {
const comp_type fr = ::comp(from_, et.from_);
return fr ? fr : ::comp(to_, et.to_);
}
/*===========================================================================*/
void RawGraph::vertex_type::print_to(ostream & os) const {
os << "out edges: ";
MAP(y, out_.size()) {
os << out_[y] << " ";
}
os << "in edges: ";
MAP(y, in_.size()) {
os << in_[y] << " ";
}
}
/*===========================================================================*/
comp_type
RawGraph::vertex_type::comp(const self & vt) const {
const comp_type ot = comp_cont(out_, vt.out_);
return ot ? ot : comp_cont(in_, vt.in_);
}
/*###########################################################################*/
void Graph_test() {
Graph<int, int> g1;
Graph<int, int> g2;
g1.rswap(g2);
typedef RawGraph::vertex_index vi;
vi v0 = g1.add_vertex(0);
vi v1 = g1.add_vertex(1);
vi v2 = g1.add_vertex(2);
vi v3 = g1.add_vertex(3);
g1.add_edge(v0, v1, 0);
g1.add_edge(v1, v2, 1);
g1.add_edge(v0, v3, 2);
RVector<RawGraph::vertex_index> dl;
dl.push_back(v3);
dl.push_back(v2);
dl.push_back(v1);
for (long x = dl.size() - 1; x >= 0; --x) {
if (g1.vertex(dl[x])->size_out()) {
dl.erase(&dl[x]);
}
}
RVector<RawGraph::vertex_index> rtsrt = g1.top_sort(dl, true);
cout << "Graph: " << rtsrt << "\n";
RASSERT(rtsrt.size() == g1.size_vertex());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -