我有这个代码来查找图表是否是一个强连接组件
vector<int> G[2005];
int depth = 0;
void dfs(int u)
{
visited[u] = 1;
low[u] = ++depth;
for(int i=0;i<G[u].size();++i)
{
int v = G[u][i];
if(!visited[v])
dfs(v);
low[u] = min(low[u],low[v]);
}
}
我跑了dfs(1)然后 对于每个顶点,我检查了所有顶点和每个顶点的低[u] == 1是否已被访问过。 这是正确的方法吗?它应该是,但不知何故它不起作用。 关于我想要实现的目标http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=2938&mosmsg=Submission+received+with+ID+12516894
,这是一个问题答案 0 :(得分:2)
我会使用Tarjan's algorithm。
基本上它在O(|E|)
时间内计算强连接组件的作用。然后你可以简单地看一下SCC的数量。如果它不是1,则整个图形不是一个SCC。此外,您可以提供早期退出版本,例如,一旦我找到第二个SCC退出。
一些c ++作为起点:(但仍然是伪代码)
vector<SCC> ComputeSCC(Graph& g) {
int index = 0;
vector<SCC> sccs;
stack<Vertex> s;
//for each vertex grab the SCC
for(auto v : g.vertices())
if(v.index == -1)
StronglyConnected(g, v, index, s, sccs);
return sccs;
}
void StronglyConnected(Graph& g, Vertex& v, int& i, stack<Vertex>& s, vector<SCC>& sccs) {
v.index = i;
v.lowlink = i;
i++;
s.push_back(v);
//for each successor
for(auto e : v.successors()) {
if(e.target().index == -1) {
StronglyConnected(g, e.target(), i, sccs);
v.lowlink = min(v.lowlink, e.target().lowlink);
}
else
v.lowlink = min(v.lowlink, e.target().index);
}
//If v is a root node, pop the stack and generate an SCC
if(v.lowlink == v.index) {
sccs.push_back(SCC());
Vertex w;
do {
w = S.pop();
sccs.back().push_back(w);
} while(w != v);
}
}