Submission #230650
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));
// 交差点に来たらそれを覚えとく
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()) {
a_last = route_a[idx];
b_last = route_b[idx];
if (route_a[idx].first == route_b[idx].first) {
common = route_a[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 |
3200 Byte |
Status |
WA |
Exec Time |
699 ms |
Memory |
11936 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 |
WA |
24 ms |
916 KB |
subtask0_sample02.txt |
AC |
25 ms |
792 KB |
subtask0_sample03.txt |
AC |
27 ms |
764 KB |
subtask1_01.txt |
AC |
163 ms |
8988 KB |
subtask1_02.txt |
AC |
163 ms |
8996 KB |
subtask1_03.txt |
AC |
24 ms |
920 KB |
subtask1_04.txt |
WA |
25 ms |
728 KB |
subtask1_05.txt |
WA |
26 ms |
916 KB |
subtask1_06.txt |
AC |
27 ms |
860 KB |
subtask1_07.txt |
WA |
211 ms |
11928 KB |
subtask1_08.txt |
WA |
208 ms |
11560 KB |
subtask1_09.txt |
WA |
209 ms |
11356 KB |
subtask1_10.txt |
WA |
208 ms |
11424 KB |
subtask1_11.txt |
WA |
210 ms |
11420 KB |
subtask1_12.txt |
WA |
203 ms |
11416 KB |
subtask2_01.txt |
AC |
522 ms |
8992 KB |
subtask2_02.txt |
AC |
534 ms |
8992 KB |
subtask2_03.txt |
WA |
337 ms |
916 KB |
subtask2_04.txt |
WA |
444 ms |
928 KB |
subtask2_05.txt |
WA |
458 ms |
928 KB |
subtask2_06.txt |
WA |
474 ms |
928 KB |
subtask2_07.txt |
WA |
693 ms |
11936 KB |
subtask2_08.txt |
WA |
692 ms |
11620 KB |
subtask2_09.txt |
WA |
699 ms |
11428 KB |
subtask2_10.txt |
WA |
696 ms |
11424 KB |
subtask2_11.txt |
WA |
686 ms |
11428 KB |
subtask2_12.txt |
WA |
611 ms |
11424 KB |