#include <bits/stdc++.h>
#include "incursion.h"
using namespace std;
int root, h[50005], p[50005], l[50005], r[50005], sz[50005];
vector<int> adj[50005];
void dfs(int x)
{
sz[x]=1;
for (auto y: adj[x])
{
if (y!=p[x] && l[x]==0)
{
p[y]=x; l[x]=y;
h[y]=h[x]+1;
dfs(y);
sz[x]+=sz[y];
}
else if (y!=p[x])
{
p[y]=x; r[x]=y;
h[y]=h[x]+1;
dfs(y);
sz[x]+=sz[y];
};
};
}
vector<int> mark(vector<pair<int, int>> F, int safe)
{
int n=1, i;
for (auto p: F)
{
n=max(n, p.first);
n=max(n, p.second);
adj[p.first].push_back(p.second);
adj[p.second].push_back(p.first);
};
for (i=1; i<=n; i++)
{
if (adj[i].size()==2) {root=i; break;};
};
h[root]=1;
dfs(root);
vector<int> T(n);
for (i=0; i<n; i++) {T[i]=0;};
while (h[safe]>=1) {T[safe-1]=1; safe=p[safe];};
return T;
}
void locate(vector<pair<int, int>> F, int curr, int t)
{
int n=1, i;
for (auto p: F)
{
n=max(n, p.first);
n=max(n, p.second);
adj[p.first].push_back(p.second);
adj[p.second].push_back(p.first);
};
for (i=1; i<=n; i++)
{
if (adj[i].size()==2) {root=i; break;};
};
h[root]=1;
dfs(root);
if (t==0)
{
do {curr=p[curr]; i=visit(curr);}
while (i==0);
};
if (l[curr]==0) {return;};
do
{
if (sz[l[curr]]<=sz[r[curr]]) {curr=r[curr];}
else {curr=l[curr];};
i=visit(curr);
if (i==0)
{
curr=p[curr];
i=visit(curr);
if (sz[l[curr]]<=sz[r[curr]]) {curr=l[curr];}
else {curr=r[curr];};
i=visit(curr);
};
}
while (l[curr]>0 && i==1);
if (i==0) {curr=p[curr]; i=visit(curr);};
return;
}
# | 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... |