luogu P1710 地鐵漲價

2022-05-09 13:24:10 字數 2498 閱讀 1228

嘟嘟嘟

一道最短路好題。

首先明確一點,把一條邊的邊權變成2,等於刪去這條邊。因為變成2後最短路肯定不會經過這條邊,就相當於刪去這條邊了。

所以題目變成了依次刪去q條邊,求每一次刪完邊後有幾個點的最短路變大了。

多做做題就會有這麼個思維:刪邊不好辦,然而逆向加邊方便多了。所以30做法就是離線逆向加邊,跑q次dijkstra。時間複雜度(qnlogn)。

正解是基於這個暴力的:想想dijkstra更新最短路的時候,如果成功從u更新了dis[v],那麼前提一定是dis[u]已經是最短路。所以每一次我們可以不跑dijkstra,只用判斷加的邊(x, y)中,當前距離dis2[x]或是dis2[y]是否已經成為了最短路,如果是,就從這個點開始嘗試更新他能走到的點的最短路(bfs, dfs都行,實測dfs更快)。然後如果到乙個點的距離變成了最短路,ans--。

然後就是**細節了:因為q <= m,所以有一些邊沒刪去,所以事先要加上,加邊的時候不要每一次都判斷dis2[x]或dis2[y]是否成為了最短路,而是在迴圈外面直接從1號節點更新,因為只有1號結點延伸出去的才可能成為最短路。而要是每一都判斷dfs的話,雖然dfs會馬上退出來,然而如果是乙個菊花圖的話,對於1號結點,每一次都遍歷了很多條邊,時間複雜度達到o(n2)。(這也就是我第7個點為啥一直tle的原因……)

還有就是dis2實際上用乙個bool陣列就夠,標記過就表示這個點已經成為了最短路,不用記錄他的距離。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 1e5 + 5;21

inline ll read()

2226

while(isdigit(ch))

27if(last == '

-') ans = -ans;

28return

ans;29}

30 inline void

write(ll x)

3136

37int

n, m, q;

38struct

edge

39e[maxn << 2

];42

inthead[maxn], ecnt;

43void add(int x, int

y)44

;46 head[x] =ecnt;47}

4849

struct

node

50egs[maxn << 1

];53

54#define pr pair55

#define mp make_pair

56bool

in[maxn];

57int

dis[maxn];

58void dijkstra(int

s)5976}

77}78}

7980

bool vis[maxn << 1

];81

int a[maxn << 1], ans[maxn << 1

], num;

8283

void solve(int now, int

d)8493}

94}9596

intmain()

97105 dijkstra(1

);106

for(rg int i = 1; i <= q; ++i) a[i] = read(), vis[a[i]] = 1

;107 mem(head, -1); ecnt = -1

;108 num = n - 1

;109

for(int i = 1; i <= m; ++i) if(!vis[i])

110114 mem(vis, 0); vis[1] = 1

;115 solve(1, 0

);116

for(rg int i = q; i; --i)

117124

for(rg int i = 1; i <= q; ++i) write(ans[i]), enter;

125return0;

126 }

view code

P1710 地鐵漲價

本題開o2優化,請注意常數 博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。...

洛谷 P1710 地鐵漲價

本題開o2優化,請注意常數 博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。...

洛谷 P1710 地鐵漲價 (dfs bfs)

博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。也就是說,從a站到b站,選擇...