bzoj 4283 魔法少女伊莉雅
題目大意
給定一個 $n$ 個點 $m$ 條邊的帶正權無向圖。要求找一條路徑滿足:
它是一條簡單路徑
它是一條嚴格次短路
對於任何一條可能存在於最短路上的邊,不能包含它的反向邊。
不存在這條路徑輸出 - 1。
題解
良心的最短路性質題,涵蓋了大部分最短路徑樹和最短路徑圖上的常用性質。
然後開始講正題。
最短路徑圖的基本性質
將 $d\left (u, v \right)$ 記為點 $u$ 到點 $v$ 的最短路的長度。
記 $d_{s}\left (x \right ) = d\left (s, x \right ), d_{t}\left (x \right ) = d\left (x, t \right )$。
最短路徑圖是 $s$ 到 $t$ 的所有最短路徑的並集。
舉個例子有助於說明:
左邊為原圖,右邊為最短路徑圖。
註意 最短路徑圖是一個有向圖。
這裏將原圖記為 $G = (V, E)$,最短路徑圖記為 $G* = (V*, E*)$。
最短路徑圖的基本性質 I(定義 1.1)
對於任意 $e \in E*$,若 $e = (u, v)$,那麽 $d_{s}(u) + w (e) + d_{t}(v) = d (s, t)$。
顯然最短路徑圖一定是一個 DAG。
最短路徑圖的基本性質 II(定理 1.1)
對於任意 $x \in V*$,那麽有 $d_{s}(x) + d_{t}(x) = d (s, t)$。
證明 如果 $s = x$,那麽結論顯然成立。
現在考慮 $s \neq x$ 的情況。暫時記 $L = d (s, t)$
由最短路徑圖的定義可知 $d_{s}(x) \geqslant L - d_{t}(x)$。因為 $x$ 不是起點,所以必然存在一個前驅 $x‘$。
根據基本性質 I 有 $d_{s}(x‘) + w (x‘, x) + d_{t}(x) = L$。由 $d_{s}(x)$ 的定義可知 $d_{s}(x) \leqslant d_{s}(x‘) + w (x, x‘) = L - d_{t}(x)$。
所以 $d_{s}(x) = L - d_{t}(x)$。
因此定理得證。
最短路徑圖的基本性質 III(推論 1.2)
對於 $e = (x, y) \in E*$,那麽有 $d_{s}(x) + w (x, y) = d_{s}(y)$。
證明 根據定理 1.1 有 $d_{s}(y) = d (s, t) - d_{t}(y)$。根據定義 1.1 有 $d_{s}(x) + w (x, y) = d (s, t) - d_{t}(y)$。然後定理得證。
最短路徑圖的基本性質 IV(推論 1.3)
如果最短路徑圖中存在一條 $x$ 到 $y$ 的簡單路徑,那麽 $d_{s}(x) + l (P*(x, y)) + d_{t}(y) = L$。其中 P*(x, y) 表示一條在 $G*$ 上的路徑,l (P*(x, y)) 表示這條路徑的長度。
重復使用推論 1.2 可以得到 $d_{s}(x) + l (P*(x, y)) = d_{s}(y)$。然後根據定理 1.1 易證。詳細證明留給讀者。
最短路徑圖的基本性質 V(推論 1.4)
最短路徑圖中一條 $x$ 到 $y$ 的簡單路徑,對應原圖中一條 $x$ 到 $y$ 的最短路。
有了推論 1.3 就可以使用反證法。詳細證明留給讀者。同時可以推出上面的 $ l (P*(x, y)) = d (x, y)$。
定理 1.5
若 $x, y \in V*$,且滿足 $x \neq y, d_{s}(x) \leqslant d_{x}(y)$,那麽在 $G*$ 中 $s$ 到 $x$ 的最短路與 $y$ 到 $t$ 的最短路不相交。
證明 根據最短路徑圖的定義(定義 1.1)可知,$s$ 到 $x$ 的過程中 $d_{s}(x‘)$ 遞增,$y$ 到 $t$ 的過程中 $d_{s}(y‘)$ 遞增。又因為 $x \neq y, d_{s}(x) \leqslant d_{x}(y)$,所以它們不相交。
定理 2
然後來講一些約定吧。
正向邊:對於一條有向邊 $(u, v)$,它在 $E*$ 中,那麽我們稱它為一條正向邊。
反向邊:對於一條有向邊 $(u, v)$,如果 $(v, u) \in E*$,那麽我們稱它為一條反向邊。
內部邊:正向邊和反向邊統稱為內部邊。
外部邊:在 $E$ 中,但不屬於 $E*$ 的邊。
現在來明確一下約定路徑的符號。
$P (u, v)$,表示一條 $u$ 到 $v$ 的路徑。
$P*(u, v)$,表示一條在 $G*$ 中 $u$ 到 $v$ 的路徑。
$P (x, y) + Q (y, z)$,表示一條沿著路徑 $P$ 從 $x$ 走到 $y$ 的,然後沿著 $Q$,從 $y$ 走到 $z$ 的路徑。
$P^{-1}(x, y)$,表示沿著路徑 $P$ 的反向邊(不是上面的定義的反向邊),從 $y$ 到 $x$ 的一條路徑。
$P^{0}(x‘, y‘)$,路徑 $P$ 上,一條 $x‘$ 到 $y‘$ 的子路徑。
$l (P)$,表示路徑 $P$ 的長度。
設所求路徑為 $S$。
外部路徑:起點和終點在 $G*$ 中,經過的變都是外部邊的一條簡單路徑。稱起點是這條路徑的拐出點,終點是這條路徑的回歸點。
定理 2.1
路徑 $S$ 中存在至少 1 條外部路徑。
證明 如果不包含外部路徑,那麽路徑 $S$ 中的邊都是正向邊(因為不能走反向邊)。由於 $G*$ 是一個 DAG,所以 $l (S) = d (s, t)$,不符合題目要求。
定理 2.2
路徑 $S$ 的包含一條外部路徑的拐出點為 $x$,回歸點為 $y$,那麽有 $d_{s}(x) \leqslant d_{s}(y)$。
證明:
假設結論不成立,那麽有 $d_{s}(x) > d_{s}(y)$。
設 $S = P (s, x) + Q (x, y) + R (y, t)$。那麽令 $U = P*(s, y) + Q^{-1}(x, y) + R*(x, t)$。因為路徑 $Q$ 是一條簡單路徑,P * 和 R * 都是由正向邊組成,根據定理 1..5 可得 P * 與 R * 不相交。所以 $U$ 是一條簡單路徑。
又因為 $U$ 包含了至少一條外部邊,所以它不是最短路。因此是一條滿足題目要求的路徑。
又因為 $P*(s, y) < P*(s, x) \leqslant P (s, x), R*(x, t) < R*(y, t) \leqslant R (y, t), Q (x, y) = Q^{-1}(x, y)$,所以 $l (U) < l (S)$。
與 $S$ 的最優性矛盾。
定理 2.3
路徑 $S$ 恰好包含一條外部路徑。
證明:
假設包含的外部路徑數目不是一條。
如果不包含外部路徑,顯然矛盾。
如果包含超過一條外部路徑,設 $S = P*(s, x) + Q (x, y) + R (y, t)$,令 $U = P*(s, x) + Q (x, y) + R*(y, t)$,其中 $Q (x, y)$ 是一條外部路徑。
根據定理 1.5 易證 $U$ 是一條簡單路徑,根據最短路徑圖的定義有 $R*(y, t) < R (y, t)$,因此 $l (U) < l (S)$,與 $S$ 的最優性矛盾。
最短路徑樹的性質
約定 $S$ 的拐出點為 $S$ 包含的外部路徑的拐出點,它的回歸點為它包含的外部路徑的回歸點。
定義 3.1
定義一棵以 $p$ 為根的最短路徑樹 $T_{p} = (V, E_{T})$ 是原圖中以 $p$ 為根的一棵有向路徑生成樹。其中一條邊 $e (v, u)$ 滿足 $d (u, p) + w (e) = d (v, p)$。
由於下面只會用到 $T_{t}$,因此,以下可能會直接將它簡記 $T$。
註意
這裏的最短路徑樹是一個有向圖。
所有有向邊都指向根節點。
一張無向圖的最短路徑圖唯一,但指定點的最短路徑生成樹可能不唯一。
然後再來定義定義子樹。
定義 3.2
在以 $p$ 為根的最短路徑生成樹中:
點 $x$ 的子樹,在 $T_{p}$ 點 $x$ 斷掉點 $x$ 的唯一一條出邊後,剩下的以 $x$ 為根的樹是點 $x$ 的子樹。記為 $T_{p}(x)$。
點 $x$ 的真子樹,點 $x$ 的真子樹是 $T_{p}(x)$ 的一個子圖。在 $T_{p}(x)$ 中,存在於點 $x$ 的真子樹的點,當且僅當它到 $x$ 的路徑上不經過除了 $x$ 以外的任何屬於 $G*$ 的點。也就是說一個 不是 $x$ 的點,但屬於 $G*$,一定不存在於 $x$ 的真子樹中。記為 $T*_{p}(x)$。
真子樹的定義可能不是很好理解(再加上我語文不好),那麽來舉個栗子:
在第三幅圖之後,邊權都被省略。在第四幅圖和第五幅圖中間橙色點標出的是在 $G*$ 中的點。
下面有一個關於真子樹的很基本的性質。
定理 3.1
對於任意 $x,y \in G*$,都有 $T*(x)\cap T*(y) = \varnothing $。
根據真子樹的定義易證。
接下來再來約定一個記號。
$P_{T}(x, y)$,在樹 $T_{t}$ 中,一條 $x$ 到 $y$ 的路徑。
最短路徑樹中的基本性質(定理 3.2)
在最短路徑樹 $T_{t}$ 中,任意一個點 $x$ 到其祖先 $y$ 的一條簡單路徑,對應原圖中一條 $x$ 到 $y$ 的最短路。
證明
證當 $y = t$ 時結論成立。
考慮 $y \neq t$ 的情況。
仍然假設不是最短路。那麽存在一條更優的路徑的從 $x$ 到 $y$,然後到 $t$ 的路徑。與 $T_{t}$ 的定義矛盾。
因此定理得證。
註意到如果將這條路徑反向,可以對應 $y$ 到 $x$ 在原圖中的一條最短路。
定義 3.3
在 $T$ 中,$x$ 的真祖先是在路徑 $P_{T}(x, t)$ 中,離 $x$ 最近的一個在 $G*$ 中的點。將它記作 $prt (x)$。
換一個說法就是沿著 $x$ 向它的出邊走,直到遇到一個在 $G*$ 中的點。註意,它可能是 $x$ 也可能是 $t$。
設 $S$ 的拐出點為 $x$,回歸點為 $z$,顯然 $x \in T*(x), z \in T*(z)$,根據定理 3.1,那麽 $T*(x)$ 和 $T*(z)$ 不存在交集。所以在 $S$ 上必然存在一條外部邊 $(w, w‘)$ 使得 $w \in T*(x)$,且 $S^{0}(w‘, z)$ 中的各點均不在 $T*(x)$ 中。有一個很顯然的事實是 $prt (w) = x$。
定理 3.3
$d_{s}(x) \leqslant d_{s}(prt(w‘))$。
註意以下證明非常繁瑣,請先喝口水再繼續閱讀。
證明
仍然假設結論不成立。那麽有 $d_{s}(x) > d_{s}(prt (w‘))$。所以 $d_{t}(x) < d_{t}(prt (w‘))$。根據定理 2.2 有 $d_{s}(x) <= d_{s}(z)$,因此 $d_{s}(prt (w‘)) < d_{s}(z)$,所以 $prt (w‘) \neq z$。根據定理 3.1,可知,必然存在一條邊 $(y, y‘)$ 使得 $y \in T*(prt (w‘))$ 且 $S^{0}(y‘, z)$ 中的各點均不在 $T*(prt (w‘))$。顯然 $prt (w‘) = prt (y)$。
令 $Q = P*(s, prt (w‘)), R = P_{T}(prt (w‘), y), P = Q + R + S^{0}(y, t)$(見下圖)。
可以證明 $R$ 實際上是在 $T*(prt (w‘))$ 中。假設路徑上經過了其它的在 $G*$ 中的點,那麽可知 $prt (y)$ 不等於 $prt (w‘)$,矛盾。
因為 $d_{s}(prt (w‘))< d_{s}(z)$,根據定理 1.5 可知 $Q$ 不與 $S^{0}(z, t)$ 相交,又因為 $R$ 在 $T*(prt (w‘))$ 中,所以經過的邊都是外部邊,所以 $P$ 中的內部邊不相交。又因為 $S^{0}(y‘. z)$ 是一條外部的簡單路徑,且不在 $T*(prt (w‘))$。所以路徑 $P$ 中的外部邊不相交。因此路徑 $P$ 是一條簡單路徑。(註意:這裏的相交指的是存在環,而不是邊與邊存在公共點。)
又因為 $P$ 包含了至少一條外部邊,所以 $P$ 是一條滿足要求的路徑(除了嚴格次短)。
因為 $S$ 是所求路徑,所以有:
$l(S) \leqslant l(P)$
$l(S^{0}(s, x)) + l(S^{0}(x, y)) + l(S^{0}(y, t)) \leqslant l(Q) + l(R) + l(S^{0}(y, t))$
$l(S^{0}(s, x)) + l(S^{0}(x, y)) \leqslant l(Q) + l(R)$
$d_{s}(x) + l (S^{0}(x, y)) \leqslant d_{s}(prt (w‘)) + l (R)$(推論 1.4)
又因為 $prt (w‘) < d_{s}(x)$,所以 $l (S^{0}(x, y)) < l (R)$。
令 $U = S^{0}(x, y)^{-1} + P*(x, t)$。那麽有:
$l(U) = l(S^{0}(x, y)^{-1}) + l(P*(x, y))\\=l(S^{0}(x,y)) + d_{t}(x)\\<l(R) + d_{t}(prt(w‘))\\=l(R^{-1}) + d_{t}(prt(w‘))\\=l(P_{t}(y,t))$
但是 $U$ 經過了至少一條外部邊,所以有 $l (U) > l (P_{T}(y, t)) = d_{t}(y)$。但是剛剛卻推出了與之矛盾的式子。
所以假設不成立,定理得證:$d_{s}(x) \leqslant (prt (w‘))$。
定理 3.4
必然存在一個滿足所有條件的路徑 S*,滿足$S* = P_{T}(s, w) + (w, w‘) + P_{T}(w‘, t)$
其中 $(w, w‘)$ 是定理 3.3 中涉及到的一條邊。
證明
令 $Q = P_{T}(s, w), R = P_{T}(w‘, t)$,根據定理 3.1 易證 $S*$ 的外部邊不相交,根據定理 3.3 和定理 1.5 易證 $S*$ 的內部邊不會相交。又因為 $(w, w‘)$ 一定是一條外部邊。所以 $S*$ 是一條簡單路徑但不是最短路徑。
因為 $S$ 中包含至少一條非樹邊,然後用反證法易證存在一個 $S*$ 是滿足題目所有要求的路徑(除非原問題不存在解)。
於是定理 3.4 創造了無限可能。
做法
我們只需要枚舉一條非內部邊,非樹邊 $e (x, y)$,且滿足 $prt (x) \neq prt (y)$ 且 $d_s (prt (x)) \leqslant d_s (prt (y))$,然後用 $d_{s}(x) + w (e) + d_{t}(y)$ 去更新答案即可。
雖然證明很復雜,但是算法卻異常簡單。
代碼
1 #include<bits/stdc++.h> 2 #define LL long long 3 #define pb push_back 4 #define _(d) while(d(isdigit(ch=getchar()))) 5 using namespace std; 6 int R(){ 7 int x;bool f=1;char ch;_(!)if(ch==‘-‘)f=0;x=ch^48; 8 _()x=(x<<3)+(x<<1)+(ch^48);return f?x:-x;} 9 const int N=5e5+5; 10 int n,m,head[N],cnt,flag[N<<1],fa[N],ans=2e9; 11 struct edge{int fro,to,nex,w;}e[N<<1]; 12 void add(int s,int t,int w){e[++cnt]=(edge){s,t,head[s],w},head[s]=cnt;} 13 struct node{ 14 int x,w; 15 bool friend operator <(node a,node b){return a.w>b.w;} 16 };priority_queue<node>q; 17 int dis[2][N]; 18 void Dij(int s,int f){ 19 memset(dis[f],0x3f,sizeof dis[f]); 20 dis[f][s]=0; 21 q.push((node){s,0}); 22 while(!q.empty()){ 23 node now=q.top();q.pop(); 24 if(dis[f][now.x]!=now.w)continue; 25 for(int k=head[now.x],v;k;k=e[k].nex) 26 if(dis[f][now.x]+e[k].w<dis[f][v=e[k].to]) 27 dis[f][v]=dis[f][now.x]+e[k].w,q.push((node){v,dis[f][v]}); 28 } 29 return; 30 } 31 vector<int> g[N]; 32 void dfs(int u){ 33 for(int i=g[u].size()-1,v;~i;i--){ 34 if(dis[0][v=g[u][i]]+dis[1][v]!=dis[0][n])fa[v]=fa[u]; 35 else fa[v]=v; 36 dfs(v); 37 } 38 } 39 int main(){ 40 n=R(),m=R(); 41 for(int i=1,u,v,w;i<=m;i++) 42 u=R(),v=R(),w=R(),add(u,v,w),add(v,u,w); 43 Dij(1,0),Dij(n,1); 44 for(int i=1;i<=n;i++) 45 for(int k=head[i],v;k;k=e[k].nex) 46 if(dis[1][i]==dis[1][v=e[k].to]+e[k].w){ 47 flag[k]=1,g[v].pb(i); 48 break; 49 } 50 fa[n]=n,dfs(n); 51 for(int k=1,u,v,w;k<=cnt;k++) 52 if(!flag[k]&&dis[0][u=e[k].fro]<=dis[0][v=e[k].to]&&fa[u]!=fa[v]&&dis[0][u]+(w=e[k].w)+dis[1][v]!=dis[0][n]) 53 ans=min(ans,dis[0][u]+w+dis[1][v]); 54 printf("%d\n",ans); 55 return 0; 56 }View Code
轉載至:http://www.cnblogs.com/yyf0309/p/8563071.html
bzoj 4283 魔法少女伊莉雅