【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]);
}

 

posted @ 2017-10-22 16:03  那一抹落日的橙  阅读(446)  评论(0编辑  收藏  举报