Submission #1150310

#TimeUsernameProblemLanguageResultExecution timeMemory
1150310dobri_okePaths (BOI18_paths)C++20
100 / 100
354 ms55636 KiB
//#pragma GCC target ("avx2")   
//#pragma GCC optimize ("Ofast")   
#include <bits/stdc++.h>   
using namespace std;  
#define int long long  
#define F first 
#define S second 
#define pb push_back 
const int N = 3e5+100;
int n, m, k, a[N], dp[100][N];
vector < int > g[N];
signed main(){   
    ios_base::sync_with_stdio(0);     cin.tie(0);   cout.tie(0);
    cin >> n >> m >> k;
    for(int i=1;i<=n;i++) cin >> a[i];
    for(int i=1;i<=m;i++){
        int u, v;
        cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    for(int i=1;i<=n;i++){
        a[i]--;
        dp[(1<<a[i])][i]=1;
    }
    for(int j=1;j<(1<<k);j++){
        for(int i=1;i<=n;i++){
            for(auto to : g[i]){
                if(((j>>a[to])&1)==1) continue;
                dp[(1<<a[to])|j][to]+=dp[j][i];
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<(1<<k);j++){
            if(__builtin_popcount(j)>k) continue;
            if(__builtin_popcount(j)<2) continue;
            ans+=dp[j][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...