nssl1255-B(轻功)【SPFA,分层图】
生活随笔
收集整理的這篇文章主要介紹了
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,分层图】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 房屋如何缴纳契税房产契税如何缴纳
- 下一篇: 客户去了几家店都没给电脑装上系统客户去了