分层图,bzoj2763: [JLOI2011]飞行路线

来源:互联网 发布:java 获取扫描枪数据 编辑:程序博客网 时间:2024/04/29 15:55

分层图,就是在图中dp,通常是有几条路免费。

模板(2763: [JLOI2011]飞行路线)

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;struct node{int to,next,len;}edge[100005];int head[50005];int cnt;void add(int f,int t,int l){edge[cnt].to=t;edge[cnt].len=l;edge[cnt].next=head[f];head[f]=cnt++;}int n,m,k,s,t;int f[10005][15];int ans=0x3f3f3f3f;struct nn{int pos,tim,val;};priority_queue<nn>Q;bool operator< (nn a,nn b){return a.val>b.val;}void spfa(){memset(f,0x3f,sizeof(f));f[s][0]=0;nn st;st.pos=s;st.tim=0;st.val=0;Q.push(st);while(!Q.empty()){nn u=Q.top();Q.pop();if(u.pos==t){ans=min(ans,u.val);continue;}for(int i=head[u.pos];i!=-1;i=edge[i].next){int v=edge[i].to;if(f[v][u.tim]>f[u.pos][u.tim]+edge[i].len){f[v][u.tim]=f[u.pos][u.tim]+edge[i].len;nn vv;vv.pos=v;vv.tim=u.tim;vv.val=f[u.pos][u.tim]+edge[i].len;Q.push(vv);}if(u.tim+1>k)continue;if(f[v][u.tim+1]>f[u.pos][u.tim]){f[v][u.tim+1]=f[u.pos][u.tim];nn vv;vv.pos=v;vv.tim=u.tim+1;vv.val=f[u.pos][u.tim];Q.push(vv);}}}}int main(){scanf("%d %d %d",&n,&m,&k);scanf("%d %d",&s,&t);memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);add(a,b,c);add(b,a,c);}spfa();printf("%d",ans);}


0 0
原创粉丝点击