zoukankan      html  css  js  c++  java
  • [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;
    }
    代码
  • 相关阅读:
    C++开源库,欢迎补充。
    LeetCode第二题
    LeetCode第五十八题
    tomcat连接数据库oracle问题,ClassNotFoundException异常
    jsp验证码,解决无法更新验证码问题
    [面试真题] LeetCode:Symmetric Tree
    [面试真题] LeetCode:Flatten Binary Tree to Linked List
    [面试真题] LeetCode:Longest Common Prefix
    [面试真题] LeetCode:Reverse Linked List II
    [面试真题] LeetCode:Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/zzzyc/p/9264069.html
Copyright © 2011-2022 走看看