# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
899044 | josanneo22 | Tropical Garden (IOI11_garden) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define L(i,j,k) for(int i=j;i<=k;i++)
#define R(i,j,k) for(int i=j;i>=k;i--)
int N, M, P, Q;
constexpr int NN = 1005;
vector<pair<int,int>> G[NN];
int who1[NN], who2[NN], pos[NN][105];
void dfs(int u,int f, int trails){
if(trails>=101) return;
pos[u][trails]++;
if(who1[u]==-1) dfs(f, u, trails + 1);
if(f != who1[u]) dfs(who1[u], u, trails + 1);
else if(f != who2[u] && who2[u] != -1) dfs(who2[u], u, trails+1);
else dfs(f, u, trails+1);
}
void count_routes(int _N, int _M, int _P, int _R[][2],int _Q, int _G[]){
N=_N; M=_M; P=_P; Q=_Q;
//find the number of nodes that end at P
L(i,1,N){
who1[u] = who2[u] = -1;
mn1[u] = mn2[u] = 1E9;
memset(pos[i], 0, sizeof(pos[i]));
}
L(i, 0, M-1){
int u=_R[i][0], v=_R[i][1];
G[u].push_back(make_pair(v,i));
G[v].push_back(make_pair(u,i));
}
L(i, 1, N){
for(auto &v:G[u]){
if(v.second < mn1[u]){
mn2[u] = mn1[u];
mn1[u] = v.second;
who2[u] = who1[u];
who1[u] = v.first;
}
else if(v.second<mn2[u]){
mn2[u] = v.second;
who2[u] = v.first;
}
}
}
L(i, 1, N) dfs(i);
long long ans = 0;
L(i, 0, Q - 1){
int u = G[i];
ans += pos[P][u];
}
answer(ans);
}