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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]

發布時間:2025/7/14 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1462 通往奥格瑞玛的道路[最短路+二分+堆优化] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:洛谷

題目背景

在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術士,他是部落的中堅力量

有一天他醒來后發現自己居然到了聯盟的主城暴風城

在被眾多聯盟的士兵攻擊后,他決定逃回自己的家鄉奧格瑞瑪

題目描述

在艾澤拉斯,有n個城市。編號為1,2,3,...,n。

城市之間有m條雙向的公路,連接著兩個城市,從某個城市到另一個城市,會遭到聯盟的攻擊,進而損失一定的血量。

每次經過一個城市,都會被收取一定的過路費(包括起點和終點)。路上并沒有收費站。

假設1為暴風城,n為奧格瑞瑪,而他的血量最多為b,出發時他的血量是滿的。

歪嘴哦不希望花很多錢,他想知道,在可以到達奧格瑞瑪的情況下,他所經過的所有城市中最多的一次收取的費用的最小值是多少。

輸入輸出格式

輸入格式:

?

第一行3個正整數,n,m,b。分別表示有n個城市,m條公路,歪嘴哦的血量為b。

接下來有n行,每行1個正整數,fi。表示經過城市i,需要交費fi元。

再接下來有m行,每行3個正整數,ai,bi,ci(1<=ai,bi<=n)。表示城市ai和城市bi之間有一條公路,如果從城市ai到城市bi,或者從城市bi到城市ai,會損失ci的血量。

?

輸出格式:

?

僅一個整數,表示歪嘴哦交費最多的一次的最小值。

如果他無法到達奧格瑞瑪,輸出AFK。

?

輸入輸出樣例

輸入樣例#1:?
4 4 8 8 5 6 10 2 1 2 2 4 1 1 3 4 3 4 3 輸出樣例#1:?
10

說明

對于60%的數據,滿足n≤200,m≤10000,b≤200

對于100%的數據,滿足n≤10000,m≤50000,b≤1000000000

對于100%的數據,滿足ci≤1000000000,fi≤1000000000,可能有兩條邊連接著相同的城市。(注意細節)

?

這道題值得一寫啊。。。我卡了差不多十次。每次都是一點點瑕疵。

?

一開始想著dfs暴力搞定,如你所料,TLE了。。。于是轉向求助于dijkstra,看了看書發現最短路可以做這道題,結果是最后騙AFK騙到45分。。。

無奈求助于題解,遂用二分解之。

?

我解釋的挺不清楚的,因為我自己也沒有理解透徹,這道題比較繞,容易把最大跟最小還有限制條件一下子搞混了,就全亂了。


?

解析:

?

題目有點難理解,先解釋一下題目:

對于一個有向圖G,有兩種信息:一個是每條邊的權,一個是每個點的費用。

對于這個給定的有向圖G,從1到n的通路是一定的。

限制條件:給定一個值,使得某條1到n的通路的邊權之和不大于這個值。

我們假設滿足以上限制的這些1到n的通路的集合為S(n)。

對于這個集合S中的每個元素(即每條通路),我們記該路徑上點的費用的最大值為另一個集合max(n)。

?

嘿,有了上面這些數學語言的描述作基礎,我們可以很簡單的理解題意。

我們就是要求出max集合中的最小值。

?

思路大概是這樣:

我們首先要得到合法的可達的通路,使得歪嘴哦不死,然后就是對這條通路做限制,使得這條通路對應的max盡可能小。

我們知道,可選的點是一定的,所以本題的答案一定在所有點的集合中,為了得到更小的讓歪嘴哦不死的一個max,我們有一個解法。

假設所有可選的點是a1,a2,...an,我們就把它們排個序,從大到小來找一個既使得歪嘴哦不死,又使得max盡量小的點費用。

因為要讓他盡可能不死,所以我們用最短路算法來盡量讓他活下來。

?

哎,發現了沒有,“從大到小來找一個既使得歪嘴哦不死,又使得max盡量小的點費用。”這樣一個設定,使得我們可以用二分去解它!

二分的前提是,歪嘴哦不死!

?

我用了一個dij來判斷歪嘴哦在當前點費用限制下會不會死:

1 bool dijkstra(int limit) 2 { 3 memset(v,0,sizeof(v)); 4 memset(d,0x3f,sizeof(d)); 5 d[1]=0; 6 q.push(make_pair(0,1)); 7 while(q.size()){ 8 int index=q.top().second;q.pop(); 9 if(v[index]) continue; 10 v[index]=1; 11 for(int i=head[index];i;i=g[i].next){ 12 int y=g[i].ver,z=g[i].edge; 13 if(d[y]>d[index]+z&&c[y]<=limit){ 14 d[y]=d[index]+z; 15 q.push(make_pair(d[y],y)); 16 } 17 } 18 } 19 if(d[n]<=hp) return 1; 20 else return 0; 21 }

這個limit就是我們對這條最短路能走過的點費用最大值的限制。

?

然后是這個二分:

1 sort(u+1,u+n+1); 2 int l=1,r=n,ans=c[n]; 3 while(l<=r){ 4 int mid=(l+r)>>1; 5 if(dijkstra(u[mid])) 6 { 7 r=mid-1;ans=u[mid]; 8 } 9 else l=mid+1; 10 } 11 printf("%d\n",ans);

不做任何關于點費用的限制歪嘴哦都會死的話,那就只能AFK了(他真慘):

1   if(!dijkstra(INF)){ 2 printf("AFK\n");return 0; 3 }

?

參考代碼:

具體的我就不寫注釋了,上面已經寫的很清楚了。

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<cstring> #define N 10010 #define INF 0x3fffffff using namespace std; int head[N],d[N*100],tot,n,m,hp; int u[N*100],c[N*100]; bool v[N*100]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q; struct node{int ver,next,edge; }g[N*100]; void add(int x,int y,int val) {g[++tot].ver=y,g[tot].edge=val;g[tot].next=head[x],head[x]=tot; }bool dijkstra(int limit) {memset(v,0,sizeof(v));memset(d,0x3f,sizeof(d));d[1]=0;q.push(make_pair(0,1));while(q.size()){int index=q.top().second;q.pop();if(v[index]) continue;v[index]=1;for(int i=head[index];i;i=g[i].next){int y=g[i].ver,z=g[i].edge;if(d[y]>d[index]+z&&c[y]<=limit){d[y]=d[index]+z;q.push(make_pair(d[y],y));}}}if(d[n]<=hp) return 1;else return 0; } int main() {scanf("%d%d%d",&n,&m,&hp);for(int i=1;i<=n;i++){scanf("%d",&c[i]);//到達每個點的費用 u[i]=c[i];//我們額外搞一個數組來二分 }for(int i=1;i<=m;i++){int x,y,val;scanf("%d%d%d",&x,&y,&val);//過邊損失血量 if(x==y) continue;add(x,y,val);add(y,x,val);}if(!dijkstra(INF)){printf("AFK\n");return 0;}sort(u+1,u+n+1);int l=1,r=n,ans=c[n];while(l<=r){int mid=(l+r)>>1;if(dijkstra(u[mid])){r=mid-1;ans=u[mid];}else l=mid+1;}printf("%d\n",ans);return 0; }

2019-05-31?19:07:02

轉載于:https://www.cnblogs.com/DarkValkyrie/p/10951142.html

總結

以上是生活随笔為你收集整理的P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 狠狠撸在线 | 亚洲自拍偷拍网站 | 中文字幕蜜臀 | 咪咪色在线视频 | 欧美日本在线观看 | 波多野42部无码喷潮在线 | 国产让女高潮的av毛片 | 成人深夜在线 | 国产精品色在线 | 99成人在线视频 | 狠狠澡 | 午夜精品免费观看 | 午夜视频h | 青草福利| 91官网在线观看 | 中文字幕精品视频 | 亚洲色图视频在线观看 | www夜色| 在线亚洲精品 | 天堂资源站 | 亚洲破处视频 | 麻豆影视av | 午夜av片| 国产成人午夜 | 日本在线www | 香蕉视频在线观看www | 国产微拍一区 | 国产精品国产一区二区三区四区 | 欧美 日韩 综合 | 亚洲看片| 国产精品一区二区三区免费观看 | 日韩欧美小视频 | 亚洲国产经典 | 国产精品一二三区在线观看 | 2020国产精品 | 国产精品高潮呻吟久久aⅴ码 | 国产黑丝av | 亚洲免费网站在线观看 | 亚洲色视频 | 欧美老肥妇做爰bbww | 国产精品中文 | www.久久久久.com| 精品探花 | av巨作 | 久久嫩| 日本免费黄色片 | 91国产网站 | aa视频在线 | 国产av无码专区亚洲精品 | 久久精品2019中文字幕 | 天天插天天插 | 2022精品国偷自产免费观看 | 特极毛片| 国产日本视频 | 在线国产中文字幕 | 美国一区二区 | 国产高清视频在线免费观看 | 男人天堂免费视频 | 少妇粉嫩小泬白浆流出 | 日韩精品中文字幕一区二区三区 | 成人黄色在线 | 色啊色 | 中国av一区二区三区 | 日韩一区二区三区在线观看视频 | 日韩免费视频 | 黄色一级大片在线观看 | 淫片aaa| 欧洲一区二区三区 | 冲田杏梨一区二区三区 | 亚洲精品午夜精品 | 九九热re | com国产 | 成人性生生活性生交全黄 | 萌白酱一区二区 | 欧美亚洲| av自拍| 成年人黄色免费网站 | 国产xxxx做受性欧美88 | h片免费网站 | 午夜精品小视频 | 91久久精品国产 | 香蕉午夜视频 | 秘密基地在线观看完整版免费 | 免费观看黄色网址 | 蜜臀久久 | 在线免费观看亚洲视频 | 日本美女日批视频 | 72成人网 | 欧美日韩字幕 | 日日摸夜夜添夜夜添高潮喷水 | 亚洲国产成人精品女人久久久 | 91调教视频 | 日韩久久精品 | 熟女丝袜一区 | 宅男在线视频 | 91浏览器在线观看 | 色婷婷六月 | 亚洲靠逼| 亚洲第一中文字幕 |