제출 #1302888

#제출 시각아이디문제언어결과실행 시간메모리
1302888LudisseyNewspapers (CEOI21_newspapers)C++20
9 / 100
276 ms589824 KiB
#include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; vector<vector<int>> neigh; vector<int> dp; vector<bool> visited; vector<pair<int,int>> chose; int n; int dfs(int mask){ if(mask==0) return 0; if(visited[mask]) return dp[mask]; visited[mask]=1; int nxt=0; int only=0; for (int i = 0; i < n; i++) { if((mask&(1<<i))==0) continue; for (auto u : neigh[i]) { if((nxt&(1<<u))==0) only|=(1<<u); else if(only&(1<<u)) only^=(1<<u); nxt|=(1<<u); } } int mn=1e12; pair<int,int> mnI={-1,-1}; for (int i = 0; i < n; i++) { int nw=nxt; if(mask&(1<<i)){ for (auto u : neigh[i]) { if(only&(1<<u)) nw^=(1<<u); } } int v=dfs(nw); if(v<mn) { mn=v; mnI={i,nw}; } } dp[mask]=mn+1; chose[mask]=mnI; return mn+1; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int m; cin >> n >> m; neigh.resize(n); dp.resize((1<<n),1e12); visited.resize((1<<n),false); chose.resize((1<<n),{-1,-1}); for (int i = 0; i < m; i++) { int a,b; cin >> a >> b; a--; b--; neigh[a].push_back(b); neigh[b].push_back(a); } dp[0]=0; int ret=dfs((1<<n)-1); if(ret>=1e12) cout << "NO\n"; else{ cout << "YES\n"; cout << ret << "\n"; int cmask=(1<<n)-1; while(cmask>0){ cout << chose[cmask].first+1 << " "; cmask=chose[cmask].second; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...