码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj2763】飞行路线

时间:2017-10-22 21:34:03      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:bsp   scanf   i++   分层图   using   names   二维   inline   cstring   

这个题是前几天做的分层图问题,而且比较直接,多加一个维度就可以了

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

 

【bzoj2763】飞行路线

标签:bsp   scanf   i++   分层图   using   names   二维   inline   cstring   

原文地址:http://www.cnblogs.com/Loi-dfkdsmbd/p/7710387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!