【问题标题】:Finding the total number of cycles and cycle length查找总周期数和周期长度
【发布时间】:2010-11-06 22:16:26
【问题描述】:

我有兴趣在连接的无向图中找到循环总数和循环长度。我可以使用 DFS 吗?还是DFS只能找到一个循环?任何代码都会有所帮助。

【问题讨论】:

  • 您使用什么语言?我认为其中之一应该是 BFS =)
  • 另外,请注意,中等大小的图表中的周期数可能非常庞大。

标签: graph-theory cycle depth-first-search


【解决方案1】:

【讨论】:

  • 正是我发布的内容。我没有及时收到新帖子通知,抱歉。
  • 如引用的 pdf 中所述:循环数可以是节点数的指数。使用简单的 DFS,每个循环都使用一个时间步长,从而产生指数运行时间。如果这成为一个问题(在密集图上,即使是少于 100 个节点),必须使用更复杂的算法。我记得有一个。
【解决方案2】:

从图论我们知道:

  1. 如果图的顶点数多于边数,则不存在环(闭合轮廓)。
  2. 如果图的顶点数等于边数,则图只有一个环。
  3. 如果图的顶点数少于边数,则图有多个闭合轮廓。

这个问题可以解决,使用算法深度优先搜索

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
const int maximumSize=40;
vector<vector<int>> visited(maximumSize, vector<int>(maximumSize, 0));
vector<int> graph[maximumSize], closedContour, temporary;
int vertices, edges;
set<vector<int>> contours;
void showContentSetVector(set<vector<int>> input)
{
    for(auto iterator=input.begin(); iterator!=input.end(); ++iterator)
    {
        for(auto item : *iterator)
        {
            cout<<item<<", ";
        }
        cout<<endl;
    }
    return;
}
bool compare(int i,int j)
{
    return (i<j);
}
void createGraph()
{
    cin>>vertices>>edges;
    int vertex0, vertex1;
    for(int i=1; i<=edges; ++i)
    {
        cin>>vertex0>>vertex1;
        graph[vertex0].push_back(vertex1);
        graph[vertex1].push_back(vertex0);
    }
    return;
}
void depthFirstSearch(int initial, int current, int previous)
{
    if(visited[initial][current]==1)
    {
        for(int i=0; i<temporary.size(); ++i)
        {
            if(temporary[i]==current)
            {
                for(int j=i; j<temporary.size(); ++j)
                {
                    closedContour.push_back(temporary[j]);
                }
            }
        }
        sort(closedContour.begin(), closedContour.end(), compare);
        contours.insert(closedContour);
        closedContour.clear();
        return;
    }
    visited[initial][current]=1;
    temporary.push_back(current);
    for(int next : graph[current])
    {
        if(next==previous)
        {
            continue;
        }
        depthFirstSearch(initial, next, current);
    }
    temporary.pop_back();
    return;
}
void solve()
{
    createGraph();
    for(int vertex=1; vertex<=vertices; ++vertex)
    {
        temporary.clear();
        depthFirstSearch(vertex, vertex, -1);
    }
    cout<<"contours <- ";
    showContentSetVector(contours);
    return;
}
int main()
{
    solve();
    return 0;
}

结果如下:

contours <- 
1, 2, 3, 4, 
6, 7, 8, 

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2012-05-10
    • 2023-03-30
    • 2017-07-12
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多