Submission #1293659

#TimeUsernameProblemLanguageResultExecution timeMemory
1293659Hamed_GhaffariPolitical Development (BOI17_politicaldevelopment)C++20
16 / 100
183 ms17008 KiB
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

#define X first
#define Y second
#define SZ(x) int(x.size())

const int MXN = 5e4+5;

int n, k, deg[MXN], ans, dp[MXN], adj[MXN];
bool mark[MXN];
vector<int> g[MXN];
set<pii> st, edges;

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> k;
    for(int i=0,d; i<n; i++) {
        cin >> d;
        g[i].resize(d);
        for(int &j : g[i]) {
            cin >> j;
            deg[i]++;
            deg[j]++;
            edges.insert({min(i, j), max(i, j)});
        }
    }
    for(int i=0; i<n; i++) st.insert({deg[i], i});
    while(!st.empty()) {
        int v = st.begin()->Y;
        st.erase(st.begin());
        if(deg[v]>=10) break;
        mark[v] = 1;
        vector<int> vec = {v};
        for(int u : g[v]) if(!mark[u]) {
            st.erase({deg[u], u});
            st.insert({--deg[u], u});
            vec.push_back(u);
        }
        for(int i=0; i<SZ(vec); i++) adj[i] = 0;
        for(int i=0; i<SZ(vec); i++)
            for(int j=i+1; j<SZ(vec); j++)
                if(edges.find({min(vec[i], vec[j]), max(vec[i], vec[j])})!=edges.end())
                    adj[i] |= 1<<j,
                    adj[j] |= 1<<i;
        dp[0] = 1;
        for(int msk=1; msk<(1<<SZ(vec)); msk++) {
            int v = __lg(msk);
            dp[msk] = dp[msk^(1<<v)] & ((msk&(adj[v]|(1<<v)))==msk);
            if(dp[msk]) ans = max(ans, __builtin_popcount(msk));
        }
    }
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...