樹上問題求兩個點的最短距離,顯然能用lca
lcalc
a來進行log
nlog_n
logn
的查詢,引入了兩個無邊權的點,所以我們的路勁就可以規劃成三種x
−>y,
x−
>u−
>v−
>y,
x−
>v−
>
u>−y
x -> y, x -> u -> v -> y, x -> v -> u >- y
x−>y,
x−>u−
>v−
>y,
x−>v−
>
u>−y
,只要在這三個當中取乙個最小值就行了。接下來就是考慮求lca
lcalc
a了,有一種較為快速的求lca
lcalc
a ca
lcalc
a較為好寫),然後就可以開始最短路求解了。
/*
*/#pragma gcc optimize(2)
#pragma gcc optimize(3)
#include
#define mp make_pair
#define pb push_back
#define endl '\n'
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair pii;
const
double pi =
acos(-
1.0)
;const
double eps =
1e-7
;const
int inf =
0x3f3f3f3f
;inline ll read()
while
(c >=
'0'&& c <=
'9')
return f * x;
}void
print
(ll x)
print
(x /10)
;putchar
(x %10+
48);}
const
int n =
3e5+10;
int sz[n]
, son[n]
, fa[n]
, dep[n]
, top[n]
, n, m;
int head[n]
, to[n <<1]
, nex[n <<1]
, cnt =1;
void
add(
int x,
int y)
void
dfs1
(int rt,
int f)
}void
dfs2
(int rt,
int tp)
}int
lca(
int x,
int y)
return dep[x]
< dep[y]
? x : y;
}int
dis(
int x,
int y)
intmain()
int u =
read()
, v =
read()
;dfs1(1
,0);
dfs2(1
,1);
m =read()
;for
(int i =
1; i <= m; i++))
);}return0;
}
最短路 求最長最短路,求最短路的路徑
hdu 1595 find the longest of the shortest include include include include include include include include include include include include include defi...
最短路 最短路徑問題
題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...
最短路徑演算法 最短路
在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...