# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
127073 | Lawliet | Mousetrap (CEOI17_mousetrap) | C++14 | 1157 ms | 68172 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define MAX 1000010
using namespace std;
typedef long long int lli;
int n;
int mouse, trap;
int n1, n2;
int pai[MAX];
lli dp[MAX];
vector<int> grafo[MAX];
void DFSInit(int i, int p)
{
for(int g = 0 ; g < grafo[i].size() ; g++)
{
int prox = grafo[i][g];
if(prox == p) continue;
pai[prox] = i;
DFSInit(prox , i);
}
}
void DFS(int i, int p)
{
if(grafo[i].size() == 1 && i != trap)
{
dp[i] = 0;
return;
}
vector<int> aux;
aux.push_back( 0 );
for(int g = 0 ; g < grafo[i].size() ; g++)
{
int prox = grafo[i][g];
if(prox == p) continue;
//printf("i = %d chamei %d\n",i,prox);
//printf("i = %d prox = %d\n",i,prox);
DFS(prox , i);
aux.push_back( dp[prox] );
}
sort(aux.begin() , aux.end());
dp[i] = grafo[i].size() - 2 + aux[aux.size() - 2] + 1;
//printf("dp(%d) = %lld\n",i,dp[i]);
}
int main()
{
scanf("%d %d %d",&n,&trap,&mouse);
for(int g = 0 ; g < n - 1 ; g++)
{
scanf("%d %d",&n1,&n2);
grafo[n1].push_back(n2);
grafo[n2].push_back(n1);
}
DFSInit(trap , trap);
DFS(trap , trap);
int aux = pai[mouse];
int sum = 0;
while(aux != trap)
{
sum += grafo[aux].size() - 2;
aux = pai[aux];
}
//printf("dp = %d sum = %d\n",dp[mouse],sum);
lli ans = dp[mouse] + sum;
int cur = mouse;
//int sum = 0;
for(int g = 0 ; g < grafo[pai[cur]].size() ; g++)
{
int prox = grafo[pai[cur]][g];
if(prox == cur)
{
grafo[pai[cur]].erase(grafo[pai[cur]].begin() + g);
break;
}
}
cur = pai[cur];
while(cur != trap)
{
//printf("\n\n\n\n");
DFS(trap , trap);
//printf("cur = %d\n",cur);
aux = pai[cur];
sum = 0;
while(aux != trap)
{
sum += grafo[aux].size() - 2;
aux = pai[aux];
}
//printf("dp = %d sum = %d\n",dp[cur],sum);
ans = max(ans , dp[cur] + sum);
for(int g = 0 ; g < grafo[pai[cur]].size() ; g++)
{
int prox = grafo[pai[cur]][g];
if(prox == cur)
{
grafo[pai[cur]].erase(grafo[pai[cur]].begin() + g);
break;
}
}
cur = pai[cur];
}
printf("%lld\n",ans);
}
Compilation message (stderr)
# | 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... |