Submission #564642

#TimeUsernameProblemLanguageResultExecution timeMemory
564642Abrar_Al_SamitPaths (BOI18_paths)C++17
100 / 100
354 ms97164 KiB
#include<bits/stdc++.h>
using namespace std;

const int MX = 3e5 + 5;
vector<int>g[MX];
int n, m, k;
int tag[MX];

long long ans = 0;
long long dp[MX][32];

int bit(int x) {
  return __builtin_popcount(x);
}
long long solve(int v, int mask) {
  long long &ret = dp[v][mask];
  if(ret!=-1) return ret;
  ret = 0;
  if(bit(mask)>1) {
    ret = 1;
  }
  for(int u : g[v]) if(~mask>>tag[u]&1) {
    ret += solve(u, mask|(1<<tag[u]));
  }
  return ret;
}
void PlayGround() {
  cin>>n>>m>>k;
  for(int i=1; i<=n; ++i) {
    cin>>tag[i];
    --tag[i];
  }
  for(int i=0; i<m; ++i) {
    int u, v;
    cin>>u>>v;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  if(k==1) {
    cout<<0<<'\n';
    return;
  }


  memset(dp, -1, sizeof dp);
  for(int i=1; i<=n; ++i) {
    ans += solve(i, (1<<tag[i]));
  }
  cout<<ans<<'\n';

}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  PlayGround();
  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...