nkoj 4239 追捕遊戲

2021-08-08 10:50:27 字數 1725 閱讀 4301

問題描述

何老闆最近在玩一款追鋪遊戲,遊戲雖然簡單,何老闆仍舊樂此不疲。

遊戲地圖中有n座城市由n-1條雙向道路連線。任意兩座城市都可相互到達。一名罪犯從a城市出發沿最短路線逃往b城市。在罪犯出發的同時,何老闆控制一名警察從c城市出發去追捕那名罪犯。每條道路都有一定的長度(單位公尺)。罪犯和警察行走的速度相同,都是1秒鐘行走1公尺。

若罪犯到達b城市時還沒有被抓住,何老闆就輸掉了這局遊戲。何老闆總共玩了m局遊戲,每局遊戲開始前,何老闆想知道他是否能贏下這局遊戲,如果能,警察最少行走多少公尺才能抓到罪犯?

輸入格式

第一行,兩個整數n和m

接下來n-1行,每行三個整數x,y,z,表示城市x和y之間有一條長度為z的道路相連。

接下來m行,每行三個整數a,b,c。

輸出

m行,每行對應一局遊戲的結果。若能抓捕到罪犯。輸出乙個整數,表示警察最少需要行走的距離。若無法抓到罪犯,輸出-1。

資料

11 2

1 2 6

1 3 3

1 4 3

3 5 2

3 6 5

4 7 9

6 10 3

5 8 4

5 9 3

8 11 8

11 9 10

2 4 7

輸出

在小偷從a到b的過程中,必然在路徑上有且僅有一點t,使t與b相連,否則構成環。

如果找到這個t點,若警察在小偷之前或者恰好到達t,則可以抓到。

那麼,如何找到t點?

如圖,我們顯然可以得到這個結論:

a,b,c三點兩兩lca,則t點為其中不同的那個最近公共祖先。

另外,還需要注意邊帶權即可。

#include

#include

#include

#include

using

namespace

std;

const

int need=100060;

const

double lg2=log(2);

int n,m,i,j;

int las[need],nex[need],en[need],len[need];

int dep[need],fa[need][22],dis[need];

int tot=0,d=0;

inline

void re(int &d)

for(d=0;t>='0'&&t<='9';t=getchar())d=(d<<1)+(d<<3)+t-'0';

d=(f?(-d):(d));

}void add(int a,int b,int c)

bool vis[need];

void dfs(int s)

}int lca(int v,int u)

int getdis(int a,int b)

int main()

}

4 23學習日記

今天早上本來要趕到中控和林工一起去東莞處理ipc的事情,由於早上沒有在9 10分之前趕到,所以下午才去東莞。上午在中控沒有做太多的事情,看了一下乙太網的驅動相關的東西,以及瀏覽了一下新聞。下午過去東莞處理ipc的事情。1.在高溫裡面有看到出現重啟的情況。這種情況,乙太網出問題的可能性很大 ddr的可...

4 23學習總結

今天學會了爬蟲,昨天只能得到一行一列,今天可以得到所有分頁的內容 遇到的困難 今天想做乙個輪播圖,還沒研究明白 import bs4import pymysql import requests from bs4 import beautifulsoup import pandas as pd def...

4 2 3 子網掩碼

網際網路是由許多小型網路構成的,每個網路上都有許多主機,這樣便構成了乙個有層次的結構。ip位址在設計時就考慮到位址分配的層次特點,將每個 ip位址都分割成網路號和主機號兩部分,以便於 ip位址的定址操作。此時,需要用某種方法指定哪些位是網路號,哪些是主機號,這個任務就是由子網掩碼來承擔的。子網掩碼不...