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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【每日一题】8月6日题目精讲—追债之旅

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【每日一题】8月6日题目精讲—追债之旅 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:牛客網:

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 65536K,其他語言131072K 64bit IO Format: %lld

文章目錄

    • 題目描述
    • 題解:
    • 代碼:

題目描述

小明現在要追討一筆債務,已知有n座城市,每個城市都有編號,城市與城市之間存在道路相連(每條道路都是雙向的),經過任意一條道路需要支付費用。小明一開始位于編號為1的城市,欠債人位于編號為n的城市。小明每次從一個城市到達另一個城市需要耗時1天,而欠債人每天都會揮霍一定的錢,等到第k天后(即第k+1天)他就會離開城n并再也找不到了。小明必須要在他離開前抓到他(最開始為第0天),同時希望自己的行程花費和欠債人揮霍的錢的總和最小,你能幫他計算一下最小總和嗎?

輸入描述:
第1行輸入三個整數n,m,k,代表城市數量,道路數量和指定天數
第2-m+1行,每行輸入三個整數u,v,w,代表起點城市,終點城市和支付費用。(數據保證無重邊,自環)
第m+2行輸入k個整數,第i個整數ai代表第i天欠債人會揮霍的錢。
數據保證:0<n≤1000,0<m≤10000,0<k≤10,1≤u,v≤n,0<w,ai≤1000
輸出描述:
輸出一行,一個整數,代表小明的行程花費和欠債人揮霍的錢的最小總和,如果小明不能抓住欠債人(即不能在第k天及之前到達城n),則輸出-1。
示例1
輸入
復制

3 3 2 1 3 10 1 2 2 2 3 2 3 7

輸出
復制

13

說明
小明從1-3,總共費用=10(行程)+3(揮霍費用)=13,是方案中最小的(另一條方案花費14)。
示例2
輸入
復制

3 2 1 1 2 3 2 3 3 10

輸出
復制

-1

說明
小明無法在第1天趕到城3,所以輸出-1。

題解:

最短路問題
就是求最短路,并根據是第幾天加上相應的數
松弛條件改為dis[d+1][v]>dis[d][u]+w+a[d+1]
dis[x][y]:x表示第x天,y為點
a[]:a存儲的第x天的揮霍費用
記得特判能否在d天內抓住嫌疑犯

代碼:

#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define SZ(x) (int)x.size() typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int mod=1e9+7; //const int mod=998244353; const double eps = 1e-10; const double pi=acos(-1.0); const int maxn=1e6+10; const ll inf=0x3f3f3f3f;struct node{int d,u,w;bool operator< (const node &p)const{return w>p.w;} }; int n,m,k; vector<pii> g[maxn]; int dis[1010][1010],a[maxn]; void dij(){memset(dis,inf,sizeof dis);dis[0][1]=0;priority_queue<node>q;q.push((node){0,1,0});while(!q.empty()){node p=q.top();q.pop();int u=p.u,d=p.d;if(p.w>dis[d][u])continue;for(auto i:g[u]){int v=i.fi,w=i.se;if(d+1<=k&&dis[d+1][v]>dis[d][u]+w+a[d+1]){dis[d+1][v]=dis[d][u]+w+a[d+1];q.push((node){d+1,v,dis[d+1][v]});}}} } int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);cin>>n>>m>>k;for(int i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;g[u].pb(mp(v,w));g[v].pb(mp(u,w));}for(int i=1;i<=k;i++)cin>>a[i];dij();int ans=inf;for(int i=1;i<=k;i++)ans=min(ans,dis[i][n]);if(ans!=inf)cout<<ans;else cout<<-1;return 0; }

總結

以上是生活随笔為你收集整理的【每日一题】8月6日题目精讲—追债之旅的全部內容,希望文章能夠幫你解決所遇到的問題。

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