이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
link:https://oj.uz/problem/view/BOI16_bosses NAPOMENA:isti je zadatak samo je razlika u tome sto nema K
Удружење тенисера
Нова структура ATП (асоцијације тениских професионалаца) у којој ради
програмер Ноле има облик стабла са кореном, тако да сваком чвору дрвета
одговара један тенисер. Неки тенисер се сматра функционером других
тенисера ако је он корен подстабла које садржи друге чворове (наследнике)
којима је он функционер . У новој структури АТП удружења, сваки тенисер је
понудио списак тенисера који он жели да види на месту свог функционера.
Зараде у АТПу се утврђују према следећим захтевима:
Плата је позитиван цео број, вишеструко већа од званичне минималне зараде и не
мања од званичне минималне зараде;
Плата сваког функционера мора бити већа од збира зарада његових директних
подређених тенисера.
Напишите програм који прави нову структуру АТПа тако да се сваком тенисеру
додели функционер са списка који је он предложио, а износ плата свих
тенисера буде што мањи.
Улаз
Први ред стандардног уноса садржи две позитивне целобројне
вредности N и K, одвојене размаком (2≤N≤5000, 1≤K≤550).
Број N представља број тенисера, а број K представља минималну зараду.
Тенисери се нумеришу природним бројевима: 1, 2, 3, ..., N. Потом на
стандардном улазу следи N редова који описују списак жеља тенисера.
Ред i садржи цео број ai, праћен списком ai целих бројева. Списак садржи
бројеве тенисера које би i-ти тенисер прихватио као своје функционере
Излаз
У једином реду стандардног излаза приказати најнижи могући укупан износ
плата, међу свим важећим опцијама. Гарантовано је да су улазни подаци
изабрани тако да постоји бар једно решење.
*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN=6e3,MAXA=5e6+5,INF=1e9,LINF=1e18;
#define fi first
#define se second
#define pll pair<ll,ll>
#define pii pair<int,int>
#define mid (l+r)/2
#define sz(a) int((a).size())
#define all(a) a.begin(),a.end()
#define mod 1000000007LL
#define pb push_back
#define endl "\n"
#define PRINT(x) cerr<<#x<<'-'<<x<<endl<<flush;
#define getunique(v) {sort(all(v)); v.erase(unique(all(v)), v.end());}
#define pb push_back
#define pf push_front
#define ppf pop_front
#define ppb pop_back
#define PRINTvec(x) { cerr<<#x<<"-"; for(int i=0;i<sz(x);i++) cerr<<x[i]<<" "; cerr<<endl; }
#pragma GCC optimize("Ofast")
#pragma GCC target("fma,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("unroll-loops")
ll n,m,k,q,x,y,z,res=INF,l,r;
string s,t;
vector<int> a;
ifstream input;
ofstream output;
vector<int> adj[MAXN];
vector<ll> dist(MAXN);
vector<bool> visited(MAXN);
#ifdef ONLINE_JUDGE
#define input cin
#define output cout
#endif
ll bfs(int x){
queue<int> q;
dist[x]=1;
visited[x]=true;
q.push(x);
while(!q.empty()){
int s=q.front(); q.pop();
for(auto v:adj[s]){
if(visited[v]) continue;
visited[v]=true;
dist[v]=dist[s]+1;
q.push(v);
}
}
ll sum=0;
for(int i=1;i<=n;i++){
sum+=dist[i];
}
for(int i=1;i<=n;i++){
if(!visited[i]){
return INF;
}
}
return sum;
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>q;
for(int j=0;j<q;j++){
cin>>x;
adj[x].pb(i);
}
}
for(int i=1;i<=n;i++){
fill(all(visited),false);
fill(all(dist),0);
res=min(res,bfs(i));
}
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#ifndef ONLINE_JUDGE
input.open("D:\\UROS\\Programiranje\\input.in",ios::in);
output.open("D:\\UROS\\Programiranje\\output.out",ios::out|ios::trunc);
#endif
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
int t;
//cin>>t;
t=1;
while(t--){
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |