⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graph.cc

📁 TGFF省城程序
💻 CC
📖 第 1 页 / 共 2 页
字号:
		RASSERT(reverse_i && ! vertex_[start[x]].size_out() ||			! reverse_i && ! vertex_[start[x]].size_in());		dfs_recurse(vec, visited, start[x], reverse_i);	}// Invert to pre-visit nodes which can't be reached.	transform(visited.begin(), visited.end(), visited.begin(),	  logical_not<big_bool>());	vec.erase(vec.begin(), vec.end());	MAP(x, start.size())		top_sort_recurse(vec, visited, start[x], reverse_i);	return vec;}/*===========================================================================*/const RVector<RawGraph::vertex_index> RawGraph::RawGraph::outward_crawl(const vertex_index start) const {	RVector<vertex_index> vec;	RVector<big_bool> visited(vertex_.size(), false);	visited[start] = true;	outward_crawl_recurse(vec, visited, start);	return vec;}/*===========================================================================*/const RVector<int>RawGraph::max_depth(const vertex_index start, bool reverse_i) const {	RVector<int> vec(vertex_.size(), -1);	RVector<big_bool> visited(vertex_.size(), false);// Figure out which nodes can be reached.	RVector<vertex_index> scratch;	dfs_recurse(scratch, visited, start, reverse_i);	scratch.erase(scratch.begin(), scratch.end());// 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 {	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_.begin() + 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_typeRawGraph::edge_type::comp(const self & et) const {	const comp_type fr = rstd::comp(from_, et.from_);	return fr ? fr : rstd::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_typeRawGraph::vertex_type::comp(const self & vt) const {	const comp_type ot = comp_cont(out_, vt.out_);	return ot ? ot : comp_cont(in_, vt.in_);}/*###########################################################################*/doubleWGraph::vertex_weight(vertex_index v) const {	return (*this)[v];}/*===========================================================================*/doubleWGraph::edge_weight(edge_index e) const {	return (*this)(e);}/*###########################################################################*/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.begin() + x);		}	}	cout << g1 << "\n";	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 + -