我有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;
}