#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
#define sz(x) static_cast<int>((x).size())
#define i5 tuple<int,int,int,int,int>
signed main(){
int n,m,k;cin>>n>>m>>k;
vector<int> clr(n+1, 0);
for(int i=1;i<=n;i++){
cin>>clr[i];
clr[i]--;
}
vector<vector<int>> al(n+1);
for(int i=0;i<m;i++){
int a,b;cin>>a>>b;
al[a].pb(b);
al[b].pb(a);
}
vector<vector<int>> dp(n+1, vector<int>(1<<k, 0));
for(int i=1;i<=n;i++){
dp[i][1<<clr[i]]=1;
}
for(int i=2;i<=k;i++){
for(int x=1;x<=n;x++){
for(int y : al[x]){
for(int ym=0;ym<(1<<k);ym++){
if(ym & (1<<clr[x]) or __builtin_popcountll(ym) != i-1) continue;
dp[x][ym|(1<<clr[x])]+=dp[y][ym];
}
}
}
}
int ans=0;
for(int x=1;x<=n;x++){
for(int xm=0;xm<(1<<k);xm++){
ans+=dp[x][xm];
}
}
cout<<ans-n;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |