分层图,就是在图中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);
}