有向图DFS查找长度为3~7的所有环

算法目标:在一个有向图中寻找出所有长度在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();
}

  

未完待续。。。

猜你喜欢

转载自www.cnblogs.com/yanghh/p/12765079.html