传送门
题目描述
求简单无向图的环数
分析
状压DP
我们用
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示起点为
l
o
w
b
i
t
(
i
)
lowbit(i)
lowbit(i),终点为
j
j
j的简单路线数量,如果
j
j
j的下一个点是
l
o
w
b
i
t
(
i
)
lowbit(i)
lowbit(i),表示存在数量为
f
[
i
]
[
j
]
f[i][j]
f[i][j]的环
最后需要注意一个任意一个长度大于2的环都会被计算进去两次,任意一条边因为是无向边也会被计算进去一次,所以最后去要去掉
代码
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define _CRT_SECURE_NO_WARNINGS
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef vector<int> VI;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
const ll mod = 1000000007;
const double eps = 1e-9;
const double PI = acos(-1);
template<typename T>inline void read(T &a) {
char c = getchar(); T x = 0, f = 1; while (!isdigit(c)) {if (c == '-')f = -1; c = getchar();}
while (isdigit(c)) {x = (x << 1) + (x << 3) + c - '0'; c = getchar();} a = f * x;
}
int gcd(int a, int b) {return (b > 0) ? gcd(b, a % b) : a;}
int h[N], e[N], ne[N], idx;
int n, m;
ll f[1 << 20][20];
void add(int x, int y) {
ne[idx] = h[x], e[idx] = y, h[x] = idx++;
}
int lowbit(int x) {
return x & (-x);
}
int main() {
memset(h, -1, sizeof h);
read(n), read(m);
for (int i = 0; i < m; i++) {
int x, y;
read(x), read(y);
x--, y--;
add(x, y), add(y, x);
}
ll res = 0;
for (int i = 0; i < n; i++) f[1 << i][i] = 1;
for (int i = 0; i < (1 << n); i++)
for (int j = 0; j < n; j++) {
if (!(i >> j & 1)) continue;
for (int p = h[j]; ~p; p = ne[p]) {
int v = e[p];
if ((1 << v) < lowbit(i)) continue;
if ((i >> v & 1) && (1 << v == lowbit(i))) res += f[i][j];
else f[i + (1 << v)][v] += f[i][j];
}
}
dl((res - m) / 2);
return 0;
}
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/