[JLOI2011]飞行路线

这是一道神题。。。为什么呢。。。这是我迄今为止。。。唯一一道在BZOJ上A掉。。。但是luogu上不A的题

这道题。。。思路清晰明了。。。分层图。。。枚举那条边归零。。。

luogu上卡SPFA。。。然而。。。BZOJ上不应该是一样的数据吗。。。/(ㄒoㄒ)/~~

呆码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 200010
using namespace std;

struct asd{
    int nxt;
    int to;
    int dis;
} a[maxn];

struct sdf{
    int time,pont;
    sdf(int a,int b):time(a),pont(b){}
    sdf(){}
};

int head[maxn],dis[11][maxn],num,k,ans=2147483647,s,t,n,m;
bool use[11][maxn];
queue <sdf> q;

inline void add(int x,int y,int z)
{
    a[++num].nxt=head[x];
    a[num].to=y;
    a[num].dis=z;
    head[x]=num;
}

inline void spfa(int u)
{
    memset(dis,127,sizeof(dis));
//    int headd=0,taill=0;
//    temp[++taill].time=0; temp[taill].pont=u;
    q.push(sdf(0,u));
    dis[0][u]=0; use[0][u]=1;
//    while(headd<taill)
    while(!q.empty())
    {
//        int now=temp[++headd].pont,j=temp[headd].time;
        sdf j=q.front(); q.pop();
        use[j.time][j.pont]=0;
        for(int i=head[j.pont];i;i=a[i].nxt)
        {
            int to=a[i].to;
            if(dis[j.time][to]>dis[j.time][j.pont]+a[i].dis)
            {
                dis[j.time][to]=dis[j.time][j.pont]+a[i].dis;
                if(!use[j.time][to])
                {
//                    temp[++taill].pont=to;
//                    temp[taill].time=j;
                    q.push(sdf(j.time,to));
                    use[j.time][to]=1;
                }
            }
        }
        if(j.time<k)
        {
            for(int i=head[j.pont];i;i=a[i].nxt)
            {
                int to=a[i].to;
                if(dis[j.time+1][to]>dis[j.time][j.pont])
                {
                    dis[j.time+1][to]=dis[j.time][j.pont];
                    if(!use[j.time+1][to])
                    {
//                        temp[++taill].pont=to;
//                        temp[taill].time=j+1;
                        q.push(sdf(j.time+1,to));
                        use[j.time+1][to]=1;
                    }
                }
            }
        }
    }
    for(int i=0;i<=k;i++) ans=min(ans,dis[i][t]);
}

int main()
{
    scanf("%d%d%d",&n,&m,&k);
//    scanf("%d%d",&s,&t);
    s=1; t=n;
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z); add(y,x,z);
    }
    spfa(s);
    printf("%d
",ans);
    return 0;
}
代码
原文地址:https://www.cnblogs.com/zzzyc/p/9264069.html