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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nssl1255-B(轻功)【SPFA,分层图】

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nssl1255-B(轻功)【SPFA,分层图】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題


題目大意

有k中輕功,n個木樁,每種輕功可以消耗wisw_i\ swi??s飛過aia_iai?個木樁,有些木樁有不可以被某種輕功飛過的限制,然后切換一次輕功要WsW\ sW?s


解題思路

將圖分成kkk層,每層表示在不同的輕功狀態,然后根據提議建圖就好了。


code

#include<cstdio> #include<vector> #include<cstring> #include<queue> #include<algorithm> #define K 210 #define N 510 #define p(x,y) (x-1)*n+y using namespace std; struct node{int to,w,next; }a[N*K*K+N*K]; vector<int> no[N]; queue<int> q; int n,tot,W,ar[K],w[K],ls[N*K],f[N*K],k,x,y,Q; bool v[N*K]; void addl(int x,int y,int w) {a[++tot].to=y;a[tot].w=w;a[tot].next=ls[x];ls[x]=tot; } void spfa()//SPFA {memset(f,127/3,sizeof(f));for(int i=1;i<=k;i++)q.push(p(i,1)),f[p(i,1)]=0,v[p(i,1)]=1;while(!q.empty()){int x=q.front();q.pop();v[x]=0;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y]){q.push(y);v[y]=true;}}}} } int main() {scanf("%d%d%d",&n,&k,&W);n++;for(int i=1;i<=k;i++)scanf("%d%d",&ar[i],&w[i]);scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d%d",&x,&y);x++;no[y].push_back(x);}for(int i=1;i<=k;i++){sort(no[i].begin(),no[i].end());int now=0;for(int j=1;j<=n-ar[i];j++){while(now<no[i].size()&&j>no[i][now]) now++;if(now<no[i].size()&&no[i][now]<=j+ar[i]) continue;addl(p(i,j),p(i,j+ar[i]),w[i]);}}for(int ki=1;ki<=n;ki++)for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)if(i!=j)addl(p(i,ki),p(j,ki),W);spfa();int ans=2147483647;for(int i=1;i<=k;i++)ans=min(ans,f[p(i,n)]);if(ans>2147483647/4) printf("-1");else printf("%d",ans); }

總結

以上是生活随笔為你收集整理的nssl1255-B(轻功)【SPFA,分层图】的全部內容,希望文章能夠幫你解決所遇到的問題。

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