1. 程式人生 > >HDU 5952 Counting Cliques(dfs)

HDU 5952 Counting Cliques(dfs)

lap ont there ins -- icpc output stream script

Counting Cliques

Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1855 Accepted Submission(s): 735

Problem Description A clique is a complete graph, in which there is an edge between every pair of the vertices. Given a graph with N vertices and M edges, your task is to count the number of cliques with a specific size S in the graph.

Input The first line is the number of test cases. For each test case, the first line contains 3 integers N,M and S (N ≤ 100,M ≤ 1000,2 ≤ S ≤ 10), each of the following M lines contains 2 integers u and v (1 ≤ u < v ≤ N), which means there is an edge between vertices u and v. It is guaranteed that the maximum degree of the vertices is no larger than 20.

Output For each test case, output the number of cliques with size S in the graph.

Sample Input 3 4 3 2 1 2 2 3 3 4 5 9 3 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5 6 15 4 1 2 1 3 1 4 1 5 1 6 2 3 2 4 2 5 2 6 3 4 3 5 3 6 4 5 4 6 5 6

Sample Output 3 7 15

Source 2016ACM/ICPC亞洲區沈陽站-重現賽(感謝東北大學)

Recommend jiangzijing2015

題意:

  給你n個點,m條邊,要你在這些點裏面找大小為s 的完全圖(完全圖是指這個圖裏任意兩點都有一條邊)。

  因為 N 只有100個。S最大也才10。所以我們可以爆搜來解決。然後我就T了 :(

  因為 1 2 3 如果是完全圖的話,那麽 2 1 3 也是。所以我們多搜了很多次。

  如果我們建邊的時候是按照 小的指向 大的點來建,就可以避免了很多情況。

技術分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <algorithm>
 6 #include <cmath>
 7 #include <vector>
 8 #include <queue>
 9 #include <map>
10 #include <stack>
11 #include <set>
12 using namespace std;
13 typedef long long LL;
14 #define ms(a, b) memset(a, b, sizeof(a))
15 #define pb push_back
16 #define mp make_pair
17 const LL INF = 0x7fffffff;
18 const int inf = 0x3f3f3f3f;
19 const int mod = 1e9+7;
20 const int maxn = 100+10;
21 bool edge[maxn][maxn];
22 vector <int> E[maxn];
23 int num[maxn];
24 int p[20];
25 int ans, n, m, s, u, v;
26 void init() {
27     ms(edge, 0);
28     ms(num, 0);
29     for(int i = 0;i<maxn;i++)   E[i].clear();
30     ans = 0;
31 }
32 void dfs(int x, int len){
33     int flag = 1;
34     for(int i=0;i<len;i++){
35         if(!edge[x][p[i]]){
36             flag = 0;
37             break;
38         }
39     }
40     if(!flag){
41         return;
42     }
43     p[len] = x;
44     if(len+1==s){
45         ans++;
46         return;
47     }
48     for(int i = 0;i<E[x].size();i++){
49         dfs(E[x][i], len+1);
50     }
51 }
52 void solve() {
53     scanf("%d%d%d", &n, &m, &s);
54     for(int i = 0;i<m;i++){
55         scanf("%d%d", &u, &v);
56         E[min(u, v)].pb(max(u, v));//小的點指向大的點
57         edge[u][v] = edge[v][u] = 1;
58         num[u]++;
59         num[v]++;
60     }
61     for(int i = 1;i<=n;i++){
62         if(num[i]<s-1)  continue;
63         dfs(i, 0);
64     }
65     printf("%d\n", ans);
66 }
67 int main() {
68 #ifdef LOCAL
69     freopen("input.txt", "r", stdin);
70 //        freopen("output.txt", "w", stdout);
71 #endif
72     int T;
73     scanf("%d", &T);
74     while(T--){
75         init();
76         solve();
77     }
78     return 0;
79 }
View Code

HDU 5952 Counting Cliques(dfs)