Submission #1347073

#TimeUsernameProblemLanguageResultExecution timeMemory
1347073killerzaluuPaths (BOI18_paths)C++20
53 / 100
71 ms30328 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 100000 + 5;
const int S = 1 << 5;

int n, m, k;
int c[N];
vector<int> g[N];
long long dp[S][N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m >> k;

    for (int i = 1; i <= n; i++) {
        cin >> c[i];
        c[i]--;
    }

    for (int i = 1; i <= m; i++) {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }

    for (int i = 1; i <= n; i++) {
        dp[1 << c[i]][i] = 1;
    }

    int lim = 1 << k;

    for (int mask = 1; mask < lim; mask++) {
        if (__builtin_popcount(mask) == 1) continue;

        for (int v = 1; v <= n; v++) {
            if (((mask >> c[v]) & 1) == 0) continue;

            int pmask = mask ^ (1 << c[v]);
            long long cur = 0;

            for (int u : g[v]) {
                if ((pmask >> c[u]) & 1) {
                    cur += dp[pmask][u];
                }
            }

            dp[mask][v] = cur;
        }
    }

    long long ans = 0;

    for (int mask = 1; mask < lim; mask++) {
        if (__builtin_popcount(mask) < 2) continue;
        for (int v = 1; v <= n; v++) {
            ans += dp[mask][v];
        }
    }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...