洛谷 P1710 地鐵漲價 (dfs bfs)

2021-07-24 05:08:03 字數 2517 閱讀 3443

博艾市除了有海底高鐵連線中國大陸、台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。

地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路(連線直接相鄰的兩個點的一條邊),就要收取1博艾元。也就是說,從a站到b站,選擇的路徑不一樣,要價也會不同。

我們認為凡華中學在1號地鐵站。學生們通過地鐵通勤,他們當然知道選擇最短路來坐車的話,票價最便宜。

然而博艾地鐵公司經營不善,一直虧損,於是他們打算提價。提價一次就是將一小段鐵路原來收費1元改收2元。同一小段的鐵路不會多次提價。他們打算提價q次。

學生們知道,如果他們到學校的一條最短路徑中的一小段提價了,可以改變路徑,使總票價不變。然而隨著一條一條的鐵路被提價,當居住在某個站附近的學生發現,提價後,沒有任何一種方案可以從家到學校的費用和初始費用相等時,就會不滿。

現在地鐵公司希望知道,對於每一次漲價,有多少個站,學生會因為漲價而不滿呢?

輸入格式:

第一行為三個整數n,m,q。

接下來m行,每行2個整數ai,bi,表示第i條鐵路連線的兩個站。i表示鐵路編號。

接下來q行,每行一行整數rj,表示每次漲價的鐵路編號。

輸出格式:

q行。每行乙個整數表示不滿的車站數量。

輸入樣例#1:

5 6 5

1 21 3

4 23 2

2 55 352

413

輸出樣例#1:

022

44

【樣例解釋】

次數 車站2 車站3 車站4 車站5

初始 1 1 2 2

1 1 1 2 2

2 1 2 2 3

3 1 2 2 3

4 2 2 3 3

5 2 2 4 3

【資料範圍】

對於20%的資料 n≤100, q≤30

對於40%的資料 q≤30

對於70%的資料 正確的輸出結果中,不會有超過50種不一樣的整數(資料範圍劇透解法系列)

對於100%的資料 n≤100000, q≤m≤200000

題解:dfs+bfs

如果一條路徑漲價了,那麼為了達到花費最小的路徑,那我們一定不會再走這條邊了,所以漲價就等同於刪邊操作。

我們考慮倒序加邊。乙個車站會在何時不滿呢?一定是他最後一條最短路徑被破壞的時候,所以我們倒序加邊,當加入一條邊的時候,1到該點的路徑第一次變成最短路徑的長度,那麼可知刪掉這條邊的時候就會不滿+1.

我們可以利用bfs o(n)求出1到其他點的最短路徑,記作minn[i]

設點x到1的當前路徑長度為dis[x],若dis[x]==minn[x],則該點為擴充套件點

通過分析最短路性質發現,某個點v

新成為擴充套件點情況有兩種

(1)加邊(u,v)更新,且dis[u]==d[u]&&dis[v]==d[u]+1&&

d[v]!=dis[v]

(2)鄰居u突然成為最終圖最短路,且dis[v]==d[u]+1&&

d[v]!=dis[v]   

那麼我們可以將沒有漲價的邊先加進去,bfs求出當前的dis。然後倒序加邊,如果加邊滿足情況1,我們就dfs滿足情況2的點,並統計該邊增加的擴充套件點的個數。

因為每次點都之後被訪問一遍,所以均攤時間複雜度是o(n)。

#include#include#include#include#include#include#define n 400003

using namespace std;

int n,m,q,tot;

int point[n],v[n],dis[n],next[n],num[n],minn[n];

int vis[n],pd[n],x[n],y[n],a[n],ans;

void add(int x,int y)

void bfs() }}

void dfs(int x)

}int main()

bfs();

for (int i=1;i<=n;i++) minn[i]=dis[i];

for (int i=1;i<=q;i++) scanf("%d",&a[i]),pd[a[i]]=1;

tot=0;

memset(point,0,sizeof(point));

memset(next,0,sizeof(next));

for (int i=1;i<=m;i++) if (!pd[i]) add(x[i],y[i]);

bfs();

for (int i=q;i>=1;i--)

for (int i=1;i<=q;i++) num[i]+=num[i-1];

for (int i=1;i<=q;i++) printf("%d\n",num[i]);

}

洛谷 P1710 地鐵漲價

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

P1710 地鐵漲價

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

luogu P1710 地鐵漲價

嘟嘟嘟 一道最短路好題。首先明確一點,把一條邊的邊權變成2,等於刪去這條邊。因為變成2後最短路肯定不會經過這條邊,就相當於刪去這條邊了。所以題目變成了依次刪去q條邊,求每一次刪完邊後有幾個點的最短路變大了。多做做題就會有這麼個思維 刪邊不好辦,然而逆向加邊方便多了。所以30做法就是離線逆向加邊,跑q...