HDU-5952クリークのカウント(高速検索)

クリークは完全グラフであり、頂点のすべてのペアの間にエッジがあります。N個の頂点とM個のエッジを持つグラフが与えられた場合、あなたのタスクは、グラフ内の特定のサイズSのクリークの数を数えることです。 

入力

最初の行はテストケースの数です。各テストケースについて、最初の行には3つの整数N、MおよびS(N≤100、M≤1000,2≤S≤10)が含まれ、次のM行にはそれぞれ2つの整数uおよびv(1≤u<v)が含まれます。 ≤N)、これは頂点uとvの間にエッジがあることを意味します。頂点の最大次数が20以下であることが保証されます。

出力

テストケースごとに、サイズSのクリークの数をグラフに出力します。

サンプル入力

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

サンプル出力

3 
7 
15

質問の意味:グラフの場合、サイズSの完全グラフがいくつあるかを尋ねます。

アイデア:データはわずか100であり、明らかに暴力的な検索です。現在接続されているブロックで選択されているポイントを記録し、現在接続されているブロック内のすべてのポイントに接続されているポイントで毎回更新します

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int mod = 2147493647;
const int inf = 0x3f3f3f3f;
const int N = 110;

inline int read() {
    int x = 0;
    char c = 0;
    c = getchar();
    while(isdigit(c)) {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return x;
}

int n, m, s;
ll ans;
bool mp[N][N];
vector<int>vec[N];
bool vis[N];
int node[15];

void dfs(int tot, int u) {
    if(tot == s) {
        ans++;
        return ;
    }
    int siz = vec[u].size();
    for(int i = 0; i < siz; ++i) {
        int v = vec[u][i];
        bool flag = 1;
        for(int j = 1; j <= tot; ++j) {
            if(!mp[node[j]][v]) {
                flag = 0;
                break;
            }
        }
        if(flag) {
            node[tot + 1] = v;
            dfs(tot + 1, v);
        }
    }
}

int main() {
//    freopen("in.txt", "r", stdin);
    int t, u, v;
    t = read();
    while(t--) {
        n = read(), m = read(), s = read();
        for(int i = 1; i <= n; ++i) vec[i].clear();
        for(int i = 0; i < N; ++i)
            for(int j = 0; j <= i; ++j)
                mp[i][j] = mp[j][i] = 0;
        while(m--) {
            u = read(), v = read();
            mp[u][v] = mp[v][u] = 1;
            vec[u].push_back(v);
        }
        ans = 0;
        for(int i = 1; i <= n; ++i) {
            node[1] = i;
            dfs(1, i);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_43871207/article/details/110092054