Submission #230423


Source Code Expand

//木の頂点a,b間の距離がXならば、a,b間をつないだときにできる閉路の長さはX+1になりそう。(だって、aからbまでいって、戻ってくるんだから)
//そうすると、2点間の距離にO(1)とかO(logN)とかで応える必要があるな…… (LCA!!)
//a,b間の距離 = aから根までの距離 + bから根までの距離 - a,bのLCAから根までの距離*2
//しかし、LCA高速処理ってどうやるんだ…(大まかな設計は↑でよい。細かい設計をしよう)
//なお、1番(node[0])を「根」とする。

#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PI;

int N;
int x,y;
int Q;
int a,b;

struct NODE{
	vector<int> to;
	int oya;
	int size;
	int dist;
}node[100000];

void BFS( int st )
{
	static queue<PI> que;
	PI now;
	int i;
	que.push( PI(st,0) );
	node[st].oya = st;
	
	while( !que.empty() ){
		now = que.front();
		que.pop();
		if( node[now.first].dist != -1 )
			continue;
		node[now.first].dist = now.second;

		for( i = 0; i < node[now.first].size; i++ ){
			if( node[ node[now.first].to[i] ].oya == -1 ){
				node[ node[now.first].to[i] ].oya = now.first;
				que.push( PI( node[now.first].to[i], now.second+1 ) );
			}
		}
	}
}

//頂点a,bのLCAを求める
int LCA( int a, int b )
{
	if( a == b )
		return a;
	if( node[a].dist > node[b].dist )
		return LCA( node[a].oya, b );
	if( node[b].dist > node[a].dist )
		return LCA( a, node[b].oya );
	if( node[a].dist == node[b].dist )
		return LCA( node[a].oya, node[b].oya );
}

int main()
{
	int i,ans;
	cin >> N;
	
	if( N > 3000 )
		return 0;
		
	for( i = 0; i < N; i++ ){
		node[i].size = 0;
		node[i].dist = -1;
		node[i].oya = -1;
	}
	
	for( i = 0; i < N-1; i++ ){
		cin >> x >> y;x--;y--;
		node[x].to.push_back(y);
		node[y].to.push_back(x);
		node[x].size++;
		node[y].size++;
	}
	
	//node[0]を根としたときの、全頂点-根間の距離を記録
	BFS(0);
	
	cin >> Q;
	for( i = 0; i < Q; i++ ){
		cin >> a >> b;a--;b--;
		ans = node[a].dist + node[b].dist - node[LCA(a,b)].dist*2 + 1;	//なぜか+1しないとWA生える
		cout << ans << endl;
	}
	return 0;
}

Submission Info

Submission Time
Task D - 閉路
User startcpp
Language C++ (G++ 4.6.4)
Score 0
Code Size 2273 Byte
Status WA
Exec Time 561 ms
Memory 4700 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 0 / 30 0 / 70
Status
AC × 3
AC × 4
WA × 8
AC × 11
WA × 16
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 34 ms 4644 KB
subtask0_sample02.txt AC 38 ms 4640 KB
subtask0_sample03.txt AC 36 ms 4640 KB
subtask1_01.txt WA 33 ms 4644 KB
subtask1_02.txt WA 34 ms 4636 KB
subtask1_03.txt AC 33 ms 4644 KB
subtask1_04.txt AC 34 ms 4644 KB
subtask1_05.txt AC 34 ms 4664 KB
subtask1_06.txt AC 35 ms 4644 KB
subtask1_07.txt WA 33 ms 4640 KB
subtask1_08.txt WA 32 ms 4644 KB
subtask1_09.txt WA 33 ms 4640 KB
subtask1_10.txt WA 34 ms 4648 KB
subtask1_11.txt WA 31 ms 4648 KB
subtask1_12.txt WA 32 ms 4640 KB
subtask2_01.txt WA 34 ms 4640 KB
subtask2_02.txt WA 32 ms 4644 KB
subtask2_03.txt AC 345 ms 4648 KB
subtask2_04.txt AC 380 ms 4700 KB
subtask2_05.txt AC 452 ms 4640 KB
subtask2_06.txt AC 561 ms 4640 KB
subtask2_07.txt WA 38 ms 4640 KB
subtask2_08.txt WA 32 ms 4644 KB
subtask2_09.txt WA 32 ms 4640 KB
subtask2_10.txt WA 32 ms 4640 KB
subtask2_11.txt WA 36 ms 4644 KB
subtask2_12.txt WA 34 ms 4648 KB