풀이
임의의 두 인접한 사이클은 하나 또는 두개의 노드를 공유할 수 있으므로
두 경우의 수를 모두 구해서 겹치는 경우를 제거하자
컴비네이션으로 구하면 쉽게 구할 수 있다.
코드
#include <stdio.h>
#include <vector>
using namespace std;
typedef long long ll;
const int n_ = 200;
int n, m, one[n_], two[n_][n_];
bool gph[n_][n_];
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d %d", &u, &v); --u, --v;
gph[u][v] = gph[v][u] = true;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (!gph[i][j]) continue;
for (int k = j + 1; k < n; k++) {
if (!gph[i][k] || !gph[j][k]) continue;
one[i]++, one[j]++, one[k]++;
two[i][j]++; two[j][k]++, two[i][k]++;
two[j][i]++, two[k][j]++, two[k][i]++;
}
}
}
ll ans = 0;
for (int i = 0; i < n; i++) {
ans += (ll)one[i] * (one[i] - 1) / 2;
for (int j = 0; j < n; j++) ans -= (ll)two[i][j] * (two[i][j] - 1) / 2;
}
printf("%lld", ans);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge