算法目标:在一个有向图中寻找出所有长度在3到7之间的环,环的数量可达百万级。
数据结构定义:
#define maxN 500000 vector<int> Vout[maxN]; // 存储每个结点出边所连的所有结点。Vout[i].size()即为所有的出度 vector<int> Vin[maxN]; // 存储每个结点入边所连的所有结点。Vin[i].size()即为所有的入度 vector<int> circles; // 存储构成环的所有结果路径 vector<int> tmpPath; bool visited[maxN];
1. 基本思路:
对图中的每个结点做深度为7的DFS搜索,保存符合条件的每个环。注意这里要搜索的是全部路径,而不是遍历图中的所有点,所以需要回溯。
在栈返回上一层时,得清空结点标记并弹出结点。
void search()
{
for (int i = 0; i < N; i++)
{
if (Vout[i].size() && Vin[i].size()) // 只有出入度不为0的结点才会构成环
{
dfs7(i, i, 1);
}
}
}
void dfs7(int head, int cur, int depth)
{
visited[cur] = true;
tmpPath.push_back(start);
for(int i = 0; i < Vout[cur].size(); ++i) // 遍历所有的出边
{
int v = Vout[cur][i];
if (v == head && depth >= 3 && depth <= 7) // 环的判定条件: Vout[cur]的孩子结点v为起始点head
{
tmpPath.push_back(v);
circles.push_back(tmpPath); // 得到一条结果
tmpPath.pop_back();
}
if (depth < 7) // 继续搜索
{
dfs7(head, v, depth + 1);
}
}
visited[cur] = false;
tmpPath.pop_back();
}
未完待续。。。
原文:https://www.cnblogs.com/yanghh/p/12765079.html