具有最大节点的子图

时间:2015-08-12 14:14:24

标签: c++ algorithm graph depth-first-search

我有N个节点的图表。我必须创建最长的子图(具有最大节点)。一个节点可以与only 2个节点连接。那么我应该采取哪些节点来创建这个(max)子图?

我正在做的是: 1:从初始节点开始。我启动2 DFS功能。 (仅来自其他节点1)。

2:对于DFS中的某个节点,我使用F()函数检查所有邻居并找到我必须走的最大方式。然后我保存我必须进入index变量的节点的索引并从index启动DFS。

问题是这个算法太慢了。我该如何优化它?也许有special算法可以找到maximum subgraph

这是我的代码:

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

int used[20];
int m[20][20];
int c;


int F(int v) {
    used[v] = 1;

    int maxn = 0, index = -1, t;

    for(int i = 0; i < c; ++i) {
        if(!used[i] && m[v][i] == 1) {
            t = F(i);

            if(t > maxn) {
                maxn = t;
                index = i;
            }
        }
    }

    if(index != -1) {
        used[v] = 0;
        return maxn + 1;
    }
    else {
        used[v] = 0;
        return 1;
    }

}

int DFS(int v) {
    used[v] = 1;
    int maxn = 0, index = -1, t;
    for(int i = 0; i < c; ++i) {
        if(!used[i] && m[v][i] == 1) {
            t = F(i);
            if(t > maxn) {
                maxn = t;
                index = i;
            }
        }
    }

    if(index != -1) {
        return DFS(index) + 1;
    }
    else {
        return 0;
    }
}

int main() {

        cin >> c;

        for(int i = 0; i < c; ++i) {
            for(int j = 0; j < c; ++ j)
                cin >> m[i][j];
        }

        int maxn = DFS(0) + DFS(0) + 1;
        cout << maxn << endl;

}

0 个答案:

没有答案