제출 #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...