제출 #328912

#제출 시각아이디문제언어결과실행 시간메모리
328912iliccmarkoBosses (BOI16_bosses)C++14
67 / 100
1590 ms1060 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define endl "\n" #define INF 1000000000 #define LINF 1000000000000000LL #define pb push_back #define all(x) x.begin(), x.end() #define len(s) (int)s.size() #define test_case { int t; cin>>t; while(t--)solve(); } #define input(n, v) {for(int i = 0;i<n;i++) cin>>v[i];} #define output(n, v) {for(int i = 0;i<n;i++) cout<<v[i]<<" "; cout<<endl;} #define single_case solve(); #define line cout<<"------------"<<endl; #define ios { ios_base::sync_with_stdio(false); cin.tie(NULL); } using namespace std; int n; const int N = 5e3 + 5; vector<vector<int> > v(N); vector<vector<int> > g(N); bool vidjen[N]; ll dp[N]; void dfs(int u, int pret) { ll a = 0; for(int x : g[u]) { if(x==pret) continue; dfs(x, u); a += dp[x]; } dp[u] = a + 1LL; } void make_graph(int u) { memset(vidjen, false, sizeof(vidjen)); queue<int> q; q.push(u); for(int i = 0;i<N;i++) g[i].clear(); vidjen[u] = 1; while(len(q)) { int top = q.front(); q.pop(); for(int x : v[top]) { if(vidjen[x]) continue; q.push(x); g[top].pb(x); vidjen[x] = 1; } } for(int i = 0;i<N;i++) dp[i] = 0; for(int i = 0;i<n;i++) if(!vidjen[i]) return; dfs(u, -1); } int main() { ios cin>>n; for(int i = 0;i<n;i++) { int k; cin>>k; while(k--) { int a; cin>>a; a--; v[a].pb(i); } } ll res = LINF; for(int i = 0;i<n;i++) { ll sum = 0; make_graph(i); ll a = 1; for(int j = 0;j<n;j++) if(dp[j]==0) a = 0; else sum += dp[j]; if(!a) continue; res = min(res, sum); } cout<<res; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...