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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CSP 行车路线 最短路变型

發布時間:2023/12/10 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSP 行车路线 最短路变型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:

  • 小明和小芳出去鄉村玩,小明負責開車,小芳來導航。
  • 小芳將可能的道路分為大道和小道。大道比較好走,每走1公里小明會增加1的疲勞度。小道不好走,如果連續走小道,小明的疲勞值會快速增加,連續走s公里小明會增加s*s的疲勞度。
  • 例如:有5個路口,1號路口到2號路口為小道,2號路口到3號路口為小道,3號路口到4號路口為大道,4號路口到5號路口為小道,相鄰路口之間的距離都是2公里。如果小明從1號路口到5號路口,則總疲勞值為(2+2)2+2+22=16+2+4=22。
  • 現在小芳拿到了地圖,請幫助她規劃一個開車的路線,使得按這個路線開車小明的疲勞度最小。
      
      

    輸入格式:

  • 輸入的第一行包含兩個整數n,m,分別表示路口的數量和道路的數量。
  • 路口由1至n編號,小明需要開車從1號路口到n號路口。
  • 接下來m行描述道路,每行包含四個整數t,a,b,c,表示一條類型為t,連接a與b兩個路口,長度為c公里的雙向道路。
  • 其中t為0表示大道,t為1表示小道。保證1號路口和n號路口是連通的。
      

    輸出格式:

  • 輸出一個整數,表示最優路線下小明的疲勞度。

樣例輸入:

6 7
1 1 2 3
1 2 3 2
0 1 3 30
0 3 4 20
0 4 5 30
1 3 5 6
1 5 6 1

樣例輸出:

76

樣例說明:

  •  從1走小道到2,再走小道到3,疲勞度為52=25;然后從3走大道經過4到達5,疲勞度為20+30=50;最后從5走小道到6,疲勞度為1。總共為76。

數據規模和約定:

  • 對于30%的評測用例,1 ≤ n ≤ 8,1 ≤ m ≤ 10;
  • 對于另外20%的評測用例,不存在小道;
  • 對于另外20%的評測用例,所有的小道不相交;
  • 對于所有評測用例,1 ≤ n ≤ 500,1 ≤ m ≤ 1e5,1 ≤ a, b ≤ n,t是0或1,c ≤ 105。保證答案不超過1e6。

分析:

  • 典型的最短路問題,容易想到:如果沒有小路,那么這題就是最基礎的最短路,直接用dijkstra求解,可以通過60%的數據
  • 題目中并沒有說明是否存在重邊 10%的數據
  • 小路增加的疲勞度計算是連續走小路的路長的平方,因此在多段圖中,就不能像簡單的最短路問題一樣直接存儲節點的編號和到這個點的最短路徑長度
  • 根據題目描述,在dijkstra的過程中,每個節點都記錄 到該節點的前一段走小路的長度s、走小路前的疲勞值、走到這點的總疲勞值
  • 設置從節點1到節點i的最小疲勞值為dist1[i] - 最后一段是大路;dist2[i] - 最后一段是小路
  • 根據當前節點到下一節點路徑類別,計算產生的總疲勞值,根據情況入隊(優先隊列實現的dijkstra)
  • 注意:c<=1e5, 計算過程中可能會出現 c*c 這種計算,使用int會爆int , 把整型全部設為long long 20%的數據
  • 別問我為什么知道那些百分比,說出來都是淚
#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL INF = 1e9+10; const LL maxn = 505; typedef pair<LL,LL> P;vector<P>mp[maxn][maxn]; LL dist1[maxn],dist2[maxn],vis1[maxn],vis2[maxn]; LL n,m,t,a,b,c; struct node {LL id,totCost,daCost,xiaoCost,s;node(){}node(LL a,LL b,LL c) {id=a;totCost=b;s=c;}node(LL a,LL b,LL c,LL d){id=a;totCost=b;s=c;daCost = d;}friend bool operator<(const node& a,const node& b){if(a.totCost!=b.totCost)return a.totCost>b.totCost;return a.s>b.s;} };priority_queue<node>priq;void init() {while(!priq.empty()) priq.pop();for(LL i=0;i<maxn;i++){dist1[i] = dist2[i] = INF;vis1[i] = vis2[i]= 0;}for(LL i=0;i<maxn;i++)for(LL j=0;j<maxn;j++)mp[i][j].clear();}void input() {cin>>n>>m;while(m--){cin>>t>>a>>b>>c;mp[a][b].push_back(P(t,c));mp[b][a].push_back(P(t,c));} }void dijkstra() {dist1[1] = dist2[1] = 0;vis2[1]=1;priq.push(node(1,0,0,0));while(!priq.empty()){node e = priq.top();priq.pop();LL now=e.id;LL totCost = e.totCost;LL daCost = e.daCost;LL s = e.s;if(s) vis2[now]=1;else vis1[now]=1;for(LL i=2;i<=n;i++){if(vis1[i]&&vis2[i]) continue;for(LL j=0;j<mp[now][i].size();j++){P xxx = mp[now][i][j];if(xxx.first){ // 這條路是小路LL len = s+xxx.second;LL cost = daCost +len*len; ///watch out!! len*len>intif(cost<=dist2[i]) {dist2[i] = cost;priq.push(node(i,cost,len,daCost));}}else { // 這條路是大路LL cost = totCost + xxx.second;if(cost<=dist1[i]){dist1[i] = cost;priq.push(node(i,cost,0,cost));}}}}} }int main() {init();input();dijkstra();cout<<min(dist1[n],dist2[n])<<endl;return 0; }

轉載于:https://www.cnblogs.com/star-and-me/p/9623828.html

總結

以上是生活随笔為你收集整理的CSP 行车路线 最短路变型的全部內容,希望文章能夠幫你解決所遇到的問題。

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