首先翻译一下题目:
给定一个 n 个节点,m 条边的无向图,没有重边和自环。
从一个起点出发,经过两个结点,到达一个终点。
定义一条合法的路径,应满足经过的两个结点都只在路径中出现一次。
问合法的路径个数
该题很明显(统计方案题),一眼考虑DFS,当结点数==4时,ans++
但是要注意的是当结点数==3的时候需要特判一下起点等于终点的情况
#include<iostream>
#include<vector>
#define int long long
using namespace std;
//下面vector<int>table[]的写法可以看作定义了一个一维是大小10005的静态的,二维是动态的数组
vector<int> table[10005];//临接表存储图
vector<bool>visited(10005);//结点是否访问过
int n, m, ans = 0, start;
void dfs(int cur, int step) {
if (step == 4) {
ans++;
return;
}
else {
int len = table[cur].size();
for (int i = 0; i < len; i++) {//遍历cur结点所连接的边
int value = table[cur][i];
if (!visited[value]) {
visited[value] = 1;
dfs(value, step + 1);
visited[value] = 0;//回溯
}
else if (step == 3 && value == start) {//特判终点是起点的情况
dfs(value, step + 1);
}
}
}
}
signed main()//小技巧:这里如果还是int main的话会因为上面的#define了long long而CE
{
int v1, v2;
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> v1 >> v2;
table[v1].push_back(v2);
table[v2].push_back(v1);
}
for (int i = 1; i <= n; i++) {//遍历起点
visited[i] = 1;
dfs(start = i, 1);
visited[i] = 0;
}
cout << ans << endl;
return 0;
}