【bzoj2763】飞行路线

本文介绍了一种解决分层图问题的方法,通过增加一个维度来记录免费机会的使用次数,并利用SPFA算法进行最短路径搜索。代码示例中详细展示了如何构建图结构并进行路径寻找的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

转载于:https://www.cnblogs.com/Loi-dfkdsmbd/articles/7710387.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值