問題描述
何老闆最近在玩一款追鋪遊戲,遊戲雖然簡單,何老闆仍舊樂此不疲。輸入格式遊戲地圖中有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位址的定址操作。此時,需要用某種方法指定哪些位是網路號,哪些是主機號,這個任務就是由子網掩碼來承擔的。子網掩碼不...