根据题目描述,我们可以很清楚得知可以通过建立树来遍历,当访问的结点到4的时候就停止访问,同时我们也清楚没有重编或者自环的情况,那么我们只需要注意不要陷入死循环就可以了,
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;
struct Node {
int value;
vector <Node*> children;
};
unordered_map <int, Node*> map1;
int n, m;
int ans = 0;
void dfs(int x, int fa, int cnt)//x表示传入结点的编号,fa表示父节点编号,遇到父节点直接跳过,cnt表示当前遍历的结点数量
{
if (cnt == 4) {
ans++;
return;
}
for (int i = 0; i < map1[x]->children.size(); i++) {
Node* child = map1[x]->children[i];
if (child->value == fa) continue;//如果访问的子节点是父节点,那就跳过
dfs(child->value, x, cnt + 1);
}
return;
}
int main(void)
{
cin >> n >> m;
vector <Node> node(n + 5); //一共有n个结点
for (int i = 1; i <= n; i++) {
node[i].value = i;
map1[i] = &node[i]; //初始化结点
}
for (int i = 1; i <= m; i++) {
int a, b; cin >> a >> b;
map1[a]->children.push_back(map1[b]);
map1[b]->children.push_back(map1[a]);//由于是双向图,因此a到b和b到a都要建立边
}
for (int i = 1; i <= n; i++) {
dfs(i, -1, 1);//父节点首先填-1,因为第一个传入的点没有父节点
}
cout << ans << endl;
return 0;
}
但是某些极端的情况可能会时间超限