博艾市除了有海底高鐵連線中國大陸、台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有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 51 21 3
4 23 2
2 55 352
413
輸出樣例#1:
02244
【樣例解釋】
次數 車站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...