【GDOI 2016 Day2】SigemaGO

Description

这里写图片描述

Solution

很明显这是一道最短路嘛,只是在走的时候多一个循环,
考试的时候打的是DIJ,结果爆炸了2个点QAQ~,
出题人居然不卡S(B)PFA,啊!?

Code

Code from LYD_7_29

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define efo(i,v) for(int i=last[v];i;i=next[i])
using namespace std;
const int N=10010,M=50010,INF=2139062143;
int n,m,l,tot,to[M],wei[M],next[M],last[N],dis[6][N];
bool bz[N];
queue<int> q;
struct edge
{
    int x,y,z;
}b[M];
bool cmp(edge a,edge b){return a.x<b.x;}
void link(int u,int v,int w)
{
    to[++tot]=v,wei[tot]=w,next[tot]=last[u],last[u]=tot;
}
void spfa(int k)
{
    bz[1]=1;
    memset(dis[k],127,sizeof(dis[k]));
    dis[k][1]=0;
    q.push(1);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        bz[x]=0;
        efo(i,x)
        {
            int y=to[i];
            if(dis[k][x]+wei[i]<dis[k][y])
            {
                dis[k][y]=dis[k][x]+wei[i];
                if(!bz[y])
                {
                    bz[y]=1;
                    q.push(y);
                }
            }
            if(k>0)
            efo(j,y)
            {
                int z=to[j];
                if(dis[k-1][x]+l<dis[k][z])
                {
                    dis[k][z]=dis[k-1][x]+l;
                    if(!bz[z])
                    {
                        bz[z]=1;
                        q.push(z);
                    }
                }
            }
        }
    }
}
int main()
{
    freopen("sigemago.in","r",stdin);
    freopen("sigemago.out","w",stdout);
    int lim,u,v,w;
    scanf("%d %d %d %d",&n,&m,&l,&lim);
    fo(i,1,m)
    {
        scanf("%d %d %d",&u,&v,&w);
        link(u,v,w);
    }
    fo(i,0,lim) spfa(i);
    printf("%d\n",dis[lim][n]==INF?-1:dis[lim][n]);
    fclose(stdin);fclose(stdout);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值