Submission #1197475

#TimeUsernameProblemLanguageResultExecution timeMemory
1197475qrnPaths (BOI18_paths)C++20
100 / 100
548 ms132140 KiB
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
using namespace std;
// using namespace __gnu_pbds;

#define pb push_back
#define ins insert
#define fi first
#define se second
#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define intt long long

const intt mod = 1e9 + 7;
const intt base = 9973;
const intt inf = 1e18;
const intt mxN = 400005;
const intt L = 21;

vector<vector<intt>> graph;
vector<intt> color(mxN);

void solve() {
	intt N, M, K;
	cin >> N >> M >> K;
	graph.assign(N + 1, vector<intt> {});

	for(intt i = 1; i <= N; i++) {
		intt x;
		cin >> x;
		color[i] = x-1;
	}

	for(intt i = 1; i <= M; i++) {
		intt a, b;
		cin >> a >> b;
		graph[a].pb(b);
		graph[b].pb(a);;
	}

	vector<vector<intt>> dp(N + 1, vector<intt> ((1 << 5) + 10, 0ll));

	for(intt node = 1; node <= N; node++) dp[node][1 << color[node]] = 1;

	for(intt mask = 0; mask < (1 << K); mask++) {
		for(intt node = 1; node <= N; node++) {
			for(auto u : graph[node]) {
				if((1 << color[u]) & mask)
				dp[node][mask] += dp[u][(mask ^ (1 << color[node]))];
			}
		}		
	}

	intt ans = 0;
	for(intt node = 1; node <= N; node++) {
		// cout << node << ": ";
		for(intt mask = 0; mask < (1 << 5); mask++) {
			if(__builtin_popcount(mask) > 1) {
				ans += dp[node][mask];
			}
			// cout << mask << " : " << dp[node][mask] << endl;
		}
		// cout << endl << endl;
	}
	cout << ans << endl;
}


signed main() {
	ios_base::sync_with_stdio(0); 
	cin.tie(NULL);                
	cout.tie(NULL);
	intt tst = 1, idx = 1;
	// cin >> tst;
	while(tst--) {
		// cout << "Case " << idx << ":" << endl; 
		solve();
		// idx++;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...