[CodeForces gym 101630 J] 过路费(最短路)
problem
給定一張圖 nnn 個點 mmm 條邊,并給定閾值 kkk,以及起終點 s,ts,ts,t。
然后每條邊經過都需要支付 www 的花費,形如 (u,v,w)(u,v,w)(u,v,w) 格式給出。
求 s→ts\rightarrow ts→t 的最小花費。
最小花費定義如下:
- 如果該路徑經過的邊數 ≤k\le k≤k,則就是該路徑的邊權和。
- 如果該路徑經過的邊數 >k>k>k,則只需要求前 kkk 大的邊權和。
n,k≤1000,m≤2000,1≤wi≤1e9n,k\le 1000,m\le 2000,1\le w_i\le 1e9n,k≤1000,m≤2000,1≤wi?≤1e9。
原題:CF Gym 101630 J
solution
考試設計的部分分實際上能讓純暴力搜路徑做法拿到 70 的高分?!!(○′・д・)ノ
我們直接枚舉第 kkk 大的邊權 xxx,然后把所有邊權全都減去 xxx,當然需要和 000 比 max\text{max}max。
然后求 s→ts\rightarrow ts→t 的最短路 +x?k+x*k+x?k 就是最短路的真正花費,再全局取最小值即可。
這樣子做,我們可以求出所有第 kkk 大邊權是 xxx 的所有路徑。
如果這條路徑不足 kkk,那么你讓 kkk 大邊權為 000 就行了。
接下來我們要證明此時所有第 kkk 大邊權 ≠x\neq x?=x 的路徑花費都不存在算得比真實花費小的情況。
只要不影響到最終答案即可。
證明其實很簡單??赡懿惶珖乐?#xff1f;?
-
第 kkk 大邊權 <x<x<x。
那么前 kkk 大至少有一個減掉后邊權成為 000,后面用 k?xk*xk?x 抵消這個減去的邊權時,相當于多彌補了一些花費。
-
第 kkk 大邊權 >x>x>x。
那么除去前 kkk 大,后面的某些邊權可能也會 >x>x>x,減去后還是存在花費會被統計進路徑中。
而實際上后面這些邊權都是不用算的。
那么這道題就變成了 O(n2log?n)O(n^2\log n)O(n2logn) 了。
code
#include <bits/stdc++.h> using namespace std; #define maxn 1005 #define int long long #define Pair pair < int, int > int n, m, k, s, t; struct edge{ int u, v, w; }E[maxn << 1]; priority_queue < Pair, vector < Pair >, greater < Pair > >q; int dis[maxn]; vector < pair < int, int > > G[maxn];int dijkstra() {memset( dis, 0x3f, sizeof( dis ) );q.push( make_pair( dis[s] = 0, s ) );while( ! q.empty() ) {int u = q.top().second; int w = q.top().first; q.pop();if( dis[u] ^ w ) continue;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i].first; w = G[u][i].second;if( dis[v] > dis[u] + w ) q.push( make_pair( dis[v] = dis[u] + w, v ) );}}return dis[t]; }int solve( int x ) {for( int i = 1;i <= n;i ++ ) G[i].clear();for( int i = 1;i <= m;i ++ ) G[E[i].u].push_back( make_pair( E[i].v, max( 0ll, E[i].w - x ) ) ); return dijkstra() + x * k; }signed main() {scanf( "%lld %lld %lld %lld %lld", &n, &m, &k, &s, &t );for( int i = 1;i <= m;i ++ ) scanf( "%lld %lld %lld", &E[i].u, &E[i].v, &E[i].w );int ans = solve( 0 );for( int i = 1;i <= m;i ++ ) ans = min( ans, solve( E[i].w ) );printf( "%lld\n", ans );return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[CodeForces gym 101630 J] 过路费(最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习笔记】WQS二分详解及常见理解误区
- 下一篇: 如何选择一款适合自己电脑的固态硬盘怎么样