BZOJ 2725 Violet 6 故鄉的夢

2022-04-30 21:51:19 字數 2680 閱讀 7954

題意:給出乙個無向圖,給定起點和終點。給出q個詢問,每個詢問是刪除某條邊之後,起點到終點的最短路變成什麼?詢問之間是獨立的。

這道題不錯,但是蒟蒻完全不會做qaq,解法參考claris大佬的。

首先容易想到如果刪掉的邊不在最短路上的話,最短路是不會變的。於是我們先跑一遍最短路,找出一條最短路。

終點是如果刪掉最短路上的邊怎麼辦?

這裡我們反過來考慮,我們考慮,每一條非最短路邊對最短路的貢獻。首先分別以s和t為起點做一遍最短路記為d1[i]和d2[i],同時隨便抓一條最短路path並把它編號。

在以s為起點的最短路圖,這必定是乙個dag,我們計算f1[i]代表(最早的)(在最短路path上的)(能到達i點)的點是誰?

同理以t為起點的最短路圖,我們計算f2[i]代表(最晚的)(在最短路path上的)(能到達i點)的點是誰?

以上兩個資訊可以用拓撲排序dp計算得到。

那麼對於每一條非最短路path的邊(x,y),它的貢獻是什麼:對於當區間 [ f1[x],f2[y] ]的邊被刪除時,邊(x,y)能提供一條長度為d1[x]+len(x,y)+d2[y]的最短路,這裡要注意所謂貢獻,並不是只要刪掉區間

[ f1[x],f2[y] ]的邊,d1[x]+len(x,y)+d2[y] 就是答案,貢獻的意思是這可以作為一種選擇,並且這個選擇是所有基於邊(x,y)中最好的,因為d1[x]是正向最短路,d2[y]是反向最短路。

由上面這段路就得出做法了,我們用線段樹維護這些所有選擇,並選擇最短的,這就是答案。

細節看**:

#includeusing

namespace

std;

typedef

long

long

ll;typedef pair

pii;

const ll n=4e5+10

;const ll inf=0x3f3f3f3f3f3f3f3f

;ll n,m,s,t,t,x[n],y[n],z[n],id[n],deg[n];

vector

g[n];

ll tot,d1[n],d2[n],pre[n],path[n],f1[n],f2[n];

ll cnt=1,head[n],to[n<<1],nxt[n<<1],len[n<<1

];void

add_edge(ll x,ll y,ll z)

bool

vis[n];

priority_queue

q;void

dijkstra(ll d,ll s) }}

}queue

q;void

toposort(ll f,ll now)

}}ll min[n

<<2],tag[n<<2

];void

build(ll rt,ll l,ll r)

void

pushdown(ll rt)

void

update(ll rt,ll l,ll r,ll ql,ll qr,ll v)

ll mid=l+r>>1

; pushdown(rt);

if (ql<=mid) update(rt<<1

,l,mid,ql,qr,v);

if (qr>mid) update(rt<<1|1,mid+1

,r,ql,qr,v);

min[rt]=min(min[rt<<1],min[rt<<1|1

]);}

ll query(ll rt,ll l,ll r,ll ql,ll qr)

bool

onpath(ll x,ll y)

intmain()

cin>>s>>t; cin>>t;

if (s==t)

memset(d1,

0x3f,sizeof

(d1));

dijkstra(d1,s);

if (d1[t]>=inf)

memset(d2,

0x3f,sizeof

(d2));

dijkstra(d2,t);

memset(deg,

0,sizeof

(deg));

for (ll i=1;i<=m;i++)

for (ll i=t;i;i=pre[i]) path[++tot]=i,id[i]=tot;

for (ll i=1;i<=n;i++) if (id[i]) id[i]=tot-id[i]+1

; memset(f1,

0x3f,sizeof

(f1));

toposort(f1,s);

memset(deg,

0,sizeof

(deg));

for (ll i=1;i<=n;i++) g[i].clear();

for (ll i=1;i<=m;i++)

memset(f2,

0,sizeof

(f2));

toposort(f2,t);

tot--; build(1,1

,tot);

for (ll i=1;i<=m;i++)

if (!onpath(x[i],y[i]))

while (t--)

}return0;

}

bzoj 2725 Violet 6 故鄉的夢

無向圖,給定s和t,多次詢問在刪除某條邊時兩點間最短路 我的spfa被卡了 我們對所有不在最短路徑的上的邊 設它的起點為u 終點為v。那麼對於這條邊,包含該邊的最優的s到t路徑就應該是 s s1 u v t1 t 其中s1,t1表示最短路徑上的兩個點。那麼這樣的一條最短路可以再s1 t1中某條邊被刪...

BZOJ2724 Violet 6 蒲公英 分塊

n 個數,m 次詢問。n leq 40000,m leq 50000 看完題目 呀這不是莫隊裸題嗎?然後經過一波思 forever 考 piano 終於會做了。首先請你自行證明乙個結論 在詢問區間內任取一段子區間,詢問區間內的最小眾數一定是子區間的最小眾數或者出現在詢問區間除掉子區間的其他地方。於是...

BZOJ2709 Violet 1 迷宮花園

這題是許可權題,版權問題不放題意,我來簡要的說一下 給出乙個迷宮,有起始點終點,可以上下左右走,移動的耗時是1,可以改變上下走的耗時為v,給出乙個總耗時l,問在總耗時中的v是多少 顯然這題可以先二分答案v然後跑寬搜或者spfa來判斷,還是蠻簡單的。這題的難點就在於,看到v的範圍很小 0 v 10 就...