14571 : 모래시계

풀이

임의의 두 인접한 사이클은 하나 또는 두개의 노드를 공유할 수 있으므로

두 경우의 수를 모두 구해서 겹치는 경우를 제거하자

컴비네이션으로 구하면 쉽게 구할 수 있다.

코드

#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

wookje.kwon's profile image

wookje.kwon

2017-05-31 12:23

Read more posts by this author