日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[CodeForces gym 101630 J] 过路费(最短路)

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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 tst 的最小花費。

最小花費定義如下:

  • 如果該路徑經過的邊數 ≤k\le kk,則就是該路徑的邊權和。
  • 如果該路徑經過的邊數 >k>k>k,則只需要求前 kkk 大的邊權和。

n,k≤1000,m≤2000,1≤wi≤1e9n,k\le 1000,m\le 2000,1\le w_i\le 1e9n,k1000,m2000,1wi?1e9

原題:CF Gym 101630 J

solution

考試設計的部分分實際上能讓純暴力搜路徑做法拿到 70 的高分?!!(○′・д・)ノ

我們直接枚舉第 kkk 大的邊權 xxx,然后把所有邊權全都減去 xxx,當然需要和 000max\text{max}max

然后求 s→ts\rightarrow tst 的最短路 +x?k+x*k+x?k 就是最短路的真正花費,再全局取最小值即可。

這樣子做,我們可以求出所有第 kkk 大邊權是 xxx 的所有路徑。

如果這條路徑不足 kkk,那么你讓 kkk 大邊權為 000 就行了。

接下來我們要證明此時所有第 kkk 大邊權 ≠x\neq x?=x 的路徑花費都不存在算得比真實花費小的情況。

只要不影響到最終答案即可。

證明其實很簡單。可能不太嚴謹??

  • 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] 过路费(最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。