【bzoj2763】飞行路线
这个题是前几天做的分层图问题,而且比较直接,多加一个维度就可以了
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; struct in { int to,ne,co; }ter[100010]; struct es { int ci,d;//ci表示用了几次免费机会,d表示在哪个店 }; queue<es>qwq; int n,m,k,x,y,z,s,t1,tail,head[10010],ans[11][10010]; bool flag[11][10010];//第一维表示用了几次免费机会,第二维表示在哪个点 inline void build(int f,int l,int c) { ter[++tail]=(in){l,head[f],c},head[f]=tail; ter[++tail]=(in){f,head[l],c},head[l]=tail; } int main() { memset(head,-1,sizeof(head)); memset(ans,127,sizeof(ans)); scanf("%d%d%d%d%d",&n,&m,&k,&s,&t1); for(int i=1;i<=m;i++) scanf("%d%d%d",&x,&y,&z),build(x,y,z); qwq.push((es){0,s}),flag[0][s]=1,ans[0][s]=0; while(!qwq.empty())//spfa { es qaq=qwq.front(); for(int i=head[qaq.d];i!=-1;i=ter[i].ne) { int t=ter[i].to; if(ans[qaq.ci][t]>ans[qaq.ci][qaq.d]+ter[i].co)//这是这条路不用免费机会的情况 { ans[qaq.ci][t]=ans[qaq.ci][qaq.d]+ter[i].co; if(!flag[qaq.ci][t]) flag[qaq.ci][t]=1,qwq.push((es){qaq.ci,t}); } if(qaq.ci+1<=k&&ans[qaq.ci+1][t]>ans[qaq.ci][qaq.d])//这是用的 { ans[qaq.ci+1][t]=ans[qaq.ci][qaq.d]; if(!flag[qaq.ci+1][t]) flag[qaq.ci+1][t]=1,qwq.push((es){qaq.ci+1,t}); } } qwq.pop(); flag[qaq.ci][qaq.d]=0; } printf("%d",ans[k][t1]); }