Submission #1359494

#TimeUsernameProblemLanguageResultExecution timeMemory
1359494vlad7654Paths (BOI18_paths)C++20
23 / 100
184 ms33268 KiB
#include <bits/stdc++.h>
using namespace std;
const int NMAX=3e5, BIT=10;
vector<int> colors;
int dp[(1<<BIT)][NMAX+5];
vector<vector<int> > graph;
int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, m, k;
    cin >> n >> m >> k;
    colors.resize(n+1);
    graph.resize(n+1);
    map<int, vector<int> > mask;
    for (int i=1;i<=n;i++) {
        cin>>colors[i];
        dp[(1<<colors[i])][i]=1;
    }
    for (int i=1;i<=m;i++) {
        int x, y;
        cin>>x>>y;
        graph[x].push_back(y);
        graph[y].push_back(x);
    }
    for (int i=0;i<(1<<(k+1));i++) {
        mask[__builtin_popcount(i)].push_back(i);
    }
    for (auto it:mask) {
        for (auto msk:it.second) {
            for (int i=1;i<=n;i++) {
                for (auto neighbour:graph[i]) {
                    if (!((1<<colors[neighbour])&msk)) {
                        int new_mask=msk^(1<<colors[neighbour]);
                        dp[new_mask][neighbour]+=dp[msk][i];
                    }
                }
            }
        }
    }
    int ans=0;
    for (auto it:mask) {
        if (it.first>1) {
            for (auto x:it.second) {
                for (int i=1;i<=n;i++) {
                    ans+=dp[x][i];
                }
            }
        }
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...