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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)

發(fā)布時(shí)間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目背景

在艾澤拉斯大陸上有一位名叫歪嘴哦的神奇術(shù)士,他是部落的中堅(jiān)力量 有一天他醒來后發(fā)現(xiàn)自己居然到了聯(lián)盟的主城暴風(fēng)城 在被眾多聯(lián)盟的士兵攻擊后,他決定逃回自己的家鄉(xiāng)奧格瑞瑪

題目描述

在艾澤拉斯,有n個(gè)城市。編號(hào)為1,2,3,...,n。

城市之間有m條雙向的公路,連接著兩個(gè)城市,從某個(gè)城市到另一個(gè)城市,會(huì)遭到聯(lián)盟的攻擊,進(jìn)而損失一定的血量。

沒經(jīng)過一個(gè)城市,都會(huì)被收取一定的過路費(fèi)(包括起點(diǎn)和終點(diǎn))。路上并沒有收費(fèi)站。

假設(shè)1為暴風(fēng)城,n為奧格瑞瑪,而他的血量最多為b,出發(fā)時(shí)他的血量是滿的。

歪嘴哦不希望花很多錢,他想知道,在可以到達(dá)奧格瑞瑪?shù)那闆r下,他所經(jīng)過的所有城市中最多的一次收取的費(fèi)用的最小值是多少。

輸入輸出格式

輸入格式:

?

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

接下來有n行,每行1個(gè)正整數(shù),fi。表示經(jīng)過城市i,需要交費(fèi)fi元。

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

?

輸出格式:

?

僅一個(gè)整數(shù),表示歪嘴哦交費(fèi)最多的一次的最小值。

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

?

輸入輸出樣例

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

說明

對(duì)于60%的數(shù)據(jù),滿足n≤200,m≤10000,b≤200

對(duì)于100%的數(shù)據(jù),滿足n≤10000,m≤50000,b≤1000000000

對(duì)于100%的數(shù)據(jù),滿足ci≤1000000000,fi≤1000000000,可能有兩條邊連接著相同的城市。

代碼

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<queue> 6 #define INF 0x3f3f3f3f 7 #define ll long long 8 using namespace std; 9 struct edge{int to,next;ll w;}e[1000005]; 10 11 queue<int> q; 12 int n,m,point; 13 int h[1000005],inq[1000005]; 14 ll f[1000005],dis[1000005],allin[1000005],b,k; 15 16 void add(int u,int v,ll w){ 17 e[++point].to=v; 18 e[point].next=h[u]; 19 e[point].w=w; 20 h[u]=point;//h[節(jié)點(diǎn)u] 的邊是point 21 } 22 23 int spfa(ll limit){ 24 memcpy(allin,f,sizeof(f));//Copy 25 memset(dis,0x3f,sizeof(dis)); 26 memset(inq,0,sizeof(inq)); 27 28 dis[1]=0;inq[1]=1;q.push(1); 29 while(!q.empty()){ 30 int x=q.front();q.pop(); 31 if(allin[x]>limit) continue; 32 for(int i=h[x];i;i=e[i].next){ 33 int now=e[i].to; 34 if(dis[now]>dis[x]+e[i].w){ 35 dis[now]=dis[x]+e[i].w; 36 allin[now]=max(allin[now],allin[x]); 37 if(!inq[now]){ 38 inq[now]=1; 39 q.push(now); 40 } 41 } 42 } 43 inq[x]=0;//spfa沒寫要炸 44 } 45 46 if(allin[n]<=limit&&dis[n]<b)return 1;//不可寫 dis[n]<=b 47 return 0; 48 } 49 50 int main(){ 51 // freopen("01.in","r",stdin); 52 scanf("%d%d%lld",&n,&m,&b); 53 for(int i=1;i<=n;i++){ 54 scanf("%lld",&f[i]); 55 k=max(k,f[i]); 56 } 57 for(int i=1;i<=m;i++){ 58 int u,v;ll w; 59 scanf("%d%d%lld",&u,&v,&w); 60 add(u,v,w);add(v,u,w); 61 } 62 63 ll l=0,r=k; 64 ll ans=-1; 65 while(l<=r){ 66 ll mid=(l+r)>>1LL; 67 if(spfa(mid)){ 68 ans=mid; 69 r=mid-1; 70 } 71 else l=mid+1; 72 } 73 if(ans==-1) puts("AFK"); 74 else printf("%lld\n",ans); 75 return 0; 76 }

存邊方式比較奇怪,待議...

?

已解決?用vector不會(huì)影響
就是慢一點(diǎn)?

類似存邊的栗子:bzoj 2753: [SCOI2012] 滑雪與時(shí)間膠囊 Label:MST

?

?

轉(zhuǎn)載題解:

二分答案,spfa判定。注意數(shù)據(jù)范圍(allin[i]表示從1到i的路程中,收費(fèi)最高的是多少。)

轉(zhuǎn)載于:https://www.cnblogs.com/radiumlrb/p/5902529.html

總結(jié)

以上是生活随笔為你收集整理的洛谷 P1462 通往奥格瑞玛的道路 Label: 最小化最大值 spfa (存多条边示例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。