Submission #858536

#TimeUsernameProblemLanguageResultExecution timeMemory
858536serifefedartarPaths (BOI18_paths)C++17
100 / 100
382 ms59708 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 998244353;
const ll LOGN = 18; 
const ll INF = 1e15;
const ll MAXN = 3e5 + 5;

vector<vector<int>> graph;
int t[MAXN], dp[MAXN][32];

int main() {
	fast
	int N, M, K, a, b;
	cin >> N >> M >> K;

	graph = vector<vector<int>>(N+1, vector<int>());
	for (int i = 1; i <= N; i++) {
		cin >> t[i], t[i]--;
		for (int msk = 0; msk < 32; msk++)
			dp[i][msk] = 0;
		dp[i][1<<t[i]] = 1;
	}
	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		graph[a].push_back(b);
		graph[b].push_back(a);
	}

	for (int cnt = 2; cnt <= K; cnt++) {
		for (int msk = 0; msk < 32; msk++) {
			if (__builtin_popcount(msk) != cnt)
				continue;

			for (int node = 1; node <= N; node++) {
				int m = 1<<t[node];
				if ((m & msk) == 0)
					continue;
				for (auto u : graph[node])
					dp[node][msk] += dp[u][msk ^ m];
			}
		}
	}
		
	ll ans = 0;
	for (int i = 1; i <= N; i++) {
		for (int msk = 0; msk < 32; msk++)
			ans += dp[i][msk];
	}
	cout << ans - N << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...