Submission #218630

#TimeUsernameProblemLanguageResultExecution timeMemory
218630nicolaalexandraBosses (BOI16_bosses)C++14
67 / 100
1537 ms1024 KiB
#include <bits/stdc++.h> #define DIM 5010 #define INF 2000000000 using namespace std; vector <int> v[DIM],L[DIM]; int f[DIM],s[DIM],viz[DIM],g[DIM]; deque <int> c; int n,i,j,nr,x; void dfs (int nod, int tata){ s[nod] = 1; for (auto vecin : L[nod]) if (vecin != tata){ dfs (vecin,nod); s[nod] += s[vecin]; } } int main (){ //ifstream cin ("date.in"); // ofstream cout ("date.out"); cin>>n; for (i=1;i<=n;++i){ cin>>nr; for (j=1;j<=nr;++j){ cin>>x; v[x].push_back(i); g[i]++; } } /// mereu trb sa leg un nod de unul cat mai sus for (i=1;i<=n;++i) if (!g[i]){ c.push_back(i); f[i] = 1; } if (!c.empty()){ /// am deja radacinile obligatorii c.push_back(i); f[i] = 1; for (j=1;j<=n;++j) if (!g[j] && j != i){ c.push_back(j); f[j] = 1; } while (!c.empty()){ int nod = c.front(); c.pop_front(); for (auto vecin : v[nod]){ if (!f[vecin]){ L[nod].push_back(vecin); L[vecin].push_back(nod); f[vecin] = 1; c.push_back(vecin); }}} for (i=1;i<=n;++i) if (!g[i]) dfs (i,0); int sum = 0; for (i=1;i<=n;++i) sum += s[i]; cout<<sum; return 0; } /// trb sa am un singur arbore?? int sol = INF; for (i=1;i<=n;++i){ /// aleg o radacina for (j=1;j<=n;++j) L[j].clear(), f[j] = s[j] = 0; c.clear(); c.push_back(i); f[i] = 1; while (!c.empty()){ int nod = c.front(); c.pop_front(); for (auto vecin : v[nod]){ if (!f[vecin]){ L[nod].push_back(vecin); //L[vecin].push_back(nod); f[vecin] = 1; c.push_back(vecin); }}} dfs (i,0); int sum = 0, ok = 1; for (j=1;j<=n;++j){ sum += s[j]; if (!s[j]){ ok = 0; break; } } if (ok) /// daca am toate nodurile sol = min (sol,sum); } cout<<sol; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...