Submission #230708
Source Code Expand
#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <numeric>
using namespace std;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define FOR(i,a,b) for(int i = (a); i < (int)(b); ++i)
#define FOREACH(i, n) for (__typeof((n).begin()) i = (n).begin(); i != (n).end(); ++i)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(v) ((int)v.size())
#define pb push_back
#define mp make_pair
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
using namespace std;
// edge生成用
struct edge_element { int from, to, cost; };
struct edge { int to, cost; };
typedef pair<int, int> P; // <最短距離, 頂点番号>
const int INF = 1e9;
int V;
vector<vector<pair<int, int>>> routes(V + 1);
// 頂点sから各頂点までの距離を計算してdに格納
void dijkstra(int s, vector<vector<edge> >& G, vector<int>& d)
{
priority_queue<P, vector<P>, greater<P> > que;
fill(ALL(d), INF);
d[s] = 0;
que.push(P(0, s));
while (!que.empty()) {
P p = que.top();
que.pop();
int dist = p.first;
int v = p.second;
if (d[v] < dist) continue;
REP(i, G[v].size()) {
edge e = G[v][i];
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
que.push(P(d[e.to], e.to));
// 交差点の履歴を覚える
routes[e.to] = routes[v];
if (v == s || G[v].size() > 2) {
routes[e.to].pb( mp(v, i) );
}
}
}
}
}
int main(){
cin >> V;
routes.resize(V + 1);
vector<vector<edge>> G(V + 1);
REP(v, V-1) {
int x, y;
cin >> x >> y;
edge tmp1{ y, 1 };
edge tmp2{ x, 1 };
G[x].pb(tmp1);
G[y].pb(tmp2);
}
vector<int> d(V + 1);
dijkstra(1, G, d);
int Q;
cin >> Q;
REP(q,Q){
int a, b;
cin >> a >> b;
// 共通の祖先を探す
auto route_a = routes[a];
auto route_b = routes[b];
auto common = mp(1, -1);
pair<int, int> a_last = common;
pair<int, int> b_last = common;
int idx = 0;
while (idx < route_a.size() && idx < route_b.size()) {
if (route_a[idx].first == route_b[idx].first) {
common = route_a[idx];
a_last = route_a[idx];
b_last = route_b[idx];
}
else break;
++idx;
}
int ret = 0;
// 祖先と、その行き先が完全一致する場合
if (a_last == b_last) {
ret = abs(d[a] - d[b]) + 1;
}
else
{
int d1 = d[a] - d[common.first];
int d2 = d[b] - d[common.first];
ret = d1 + d2 + 1;
}
cout << ret << endl;
}
return 0;
}
Submission Info
Submission Time |
|
Task |
D - 閉路 |
User |
minus9d |
Language |
C++11 (GCC 4.8.1) |
Score |
0 |
Code Size |
3241 Byte |
Status |
MLE |
Exec Time |
1506 ms |
Memory |
264864 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Score / Max Score |
0 / 0 |
0 / 30 |
0 / 70 |
Status |
|
|
|
Set Name |
Test Cases |
Sample |
subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt |
Subtask1 |
subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt |
Subtask2 |
subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt |
Case Name |
Status |
Exec Time |
Memory |
subtask0_sample01.txt |
AC |
25 ms |
672 KB |
subtask0_sample02.txt |
AC |
24 ms |
924 KB |
subtask0_sample03.txt |
AC |
23 ms |
924 KB |
subtask1_01.txt |
AC |
177 ms |
12068 KB |
subtask1_02.txt |
AC |
176 ms |
12072 KB |
subtask1_03.txt |
AC |
24 ms |
672 KB |
subtask1_04.txt |
AC |
22 ms |
932 KB |
subtask1_05.txt |
AC |
27 ms |
1248 KB |
subtask1_06.txt |
AC |
28 ms |
1956 KB |
subtask1_07.txt |
AC |
311 ms |
39080 KB |
subtask1_08.txt |
AC |
291 ms |
31780 KB |
subtask1_09.txt |
AC |
464 ms |
106656 KB |
subtask1_10.txt |
AC |
684 ms |
213412 KB |
subtask1_11.txt |
MLE |
791 ms |
264864 KB |
subtask1_12.txt |
AC |
627 ms |
182896 KB |
subtask2_01.txt |
AC |
541 ms |
12128 KB |
subtask2_02.txt |
AC |
647 ms |
12064 KB |
subtask2_03.txt |
AC |
428 ms |
924 KB |
subtask2_04.txt |
AC |
454 ms |
924 KB |
subtask2_05.txt |
AC |
531 ms |
1312 KB |
subtask2_06.txt |
AC |
588 ms |
1828 KB |
subtask2_07.txt |
AC |
810 ms |
39072 KB |
subtask2_08.txt |
AC |
815 ms |
31832 KB |
subtask2_09.txt |
AC |
1052 ms |
106656 KB |
subtask2_10.txt |
AC |
1355 ms |
213396 KB |
subtask2_11.txt |
MLE |
1506 ms |
264864 KB |
subtask2_12.txt |
AC |
1354 ms |
182948 KB |