嘟嘟嘟
一道最短路好題。
首先明確一點,把一條邊的邊權變成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 #include11view codeusing
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 }
P1710 地鐵漲價
本題開o2優化,請注意常數 博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。...
洛谷 P1710 地鐵漲價
本題開o2優化,請注意常數 博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。...
洛谷 P1710 地鐵漲價 (dfs bfs)
博艾市除了有海底高鐵連線中國大陸 台灣與日本,市區裡也有很成熟的軌道交通系統。我們可以認為博艾地鐵系統是乙個無向連通圖。博艾有n個地鐵站,同時有m小段地鐵連線兩個不同的站。地鐵計價方式很簡單。從a站到b站,每經過一小段鐵路 連線直接相鄰的兩個點的一條邊 就要收取1博艾元。也就是說,從a站到b站,選擇...