이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
int n;
unordered_map<string,int> id;
bool cmp(int x, int y)
{
return x>y;
}
bool visited[1005];
int cnt[1005];
vector<int> con[1005];
void dfs(int nod)
{
visited[nod]=1;
for(auto x:con[nod])
if(!visited[x])
dfs(x);
}
vector<int> nodes;
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
string nume,aux;
cin>>nume>>aux;
bool rau=0;
if(id[nume]) rau=1;
vector<int> v;
while(cin>>aux)
{
if(aux==";")
break;
if(id[nume])
continue;
if(!id[aux] || aux==nume) rau=1;
v.push_back(id[aux]);
}
if(rau)
{
cout<<"greska\n";
continue;
}
for(int j=1;j<=n;j++)
{
visited[j]=0;
cnt[j]=0;
}
sort(v.begin(),v.end(),cmp);
for(auto x:v)
{
if(!visited[x])
{
dfs(x);
con[i].push_back(x);
}
}
for(auto x:nodes)
if(visited[x])
for(auto y:con[x])
cnt[y]++;
for(auto x:nodes)
{
if(cnt[x]>=2)
{
rau=1;
break;
}
}
if(rau)
{
cout<<"greska\n";
continue;
}
nodes.push_back(i);
id[nume]=i;
cout<<"ok\n";
}
return 0;
}
/**
vrem sa adaugam un nod nou x
trebuie sa verificam pt fiecare nod daca exista 2 copii de ai lui in care poate ajunge nodul x si care sa nu fie unul ancestorul celuilalt
putem tine pt fiecare nod doar copiii "cei mai de sus", adica daca un nod a are muchie la nodurile b si c, si b este ancestor al lui c,
putem sterge muchia (a,c) si sa pastram doar muchia (a,b)
astfel, cand adaugam un nod nou x, ne uitam prin lista de adiacenta care ne este data in ordinea descrescatoare dupa sortarea topologica si
il adaugam ca fiu al unui nod doar daca nu apare deja in subarborele lui (putem face un dfs)
observam ca o posibila sortare topologica este cea dupa ordinea in care apar nodurile in input
acum putem sa verificam pt fiecare nod daca exista cel putin 2 copii in care poate ajunge nodul x
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |