1. 程式人生 > >HDU 5952 Counting Cliques 爆搜

HDU 5952 Counting Cliques 爆搜

題目

分析

      題目資料很小,可以考慮暴力搜尋。為了防止重複,建立一個小編號點指向大編號點的圖,這樣就不會重複了,因為搜尋出來的序列一定是遞增的。
      這道題目讓我懂得了,有時候TLE,不要總想著改進演算法,要先確定自己的程式碼沒有任何問題才行。這道題目就是因為一個手誤,TLE了,然後就在那裡一直想著怎麼剪枝。

程式碼

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath> #include <set> using namespace std; const int maxn = 105; int N, M, S; int G1[maxn][maxn]; vector<int> G2[maxn]; int pre[maxn], cnt; int ans; void dfs(int u) { for (int i = 0; i < cnt; i++) { if (!G1[u][pre[i]]) { return; } } pre[cnt++] = u; if
(cnt == S) { ans++; cnt--; return; } for (unsigned i = 0; i < G2[u].size(); i++) { dfs(G2[u][i]); } cnt--; } int main() { //freopen("test.txt", "r", stdin); //freopen("out.txt", "w", stdout); int T; scanf("%d", &T); while (T--) { memset
(G1, 0, sizeof(G1)); for (int i = 0; i < maxn; i++) { G2[i].clear(); } scanf("%d%d%d", &N, &M, &S); for (int i = 0; i < M; i++) { int u, v; scanf("%d%d", &u, &v); G1[u][v] = G1[v][u] = 1; if (u > v) swap(u, v); G2[u].push_back(v); } ans = 0; for (int i = 1; i <= N; i++) { cnt = 0; dfs(i); } printf("%d\n", ans); } return 0; }