제출 #1289150

#제출 시각아이디문제언어결과실행 시간메모리
1289150WH8Paths (BOI18_paths)C++20
100 / 100
549 ms69660 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...