zoukankan      html  css  js  c++  java
  • 蓝桥杯(道路与航路)

     算法提高 道路和航路  
    时间限制:1.0s   内存限制:256.0MB
     
    问题描述

    农夫约翰正在针对一个新区域的牛奶配送合同进行研究。他打算分发牛奶到T个城镇(标号为1..T),这些城镇通过R条标号为(1..R)的道路和P条标号为(1..P)的航路相连。

    每一条公路i或者航路i表示成连接城镇Ai(1<=A_i<=T)和Bi(1<=Bi<=T)代价为Ci。每一条公路,Ci的范围为0<=Ci<=10,000;由于奇怪的运营策略,每一条航路的Ci可能为负的,也就是-10,000<=Ci<=10,000。

    每一条公路都是双向的,正向和反向的花费是一样的,都是非负的。

    每一条航路都根据输入的Ai和Bi进行从Ai->Bi的单向通行。实际上,如果现在有一条航路是从Ai到Bi的话,那么意味着肯定没有通行方案从Bi回到Ai。

    农夫约翰想把他那优良的牛奶从配送中心送到各个城镇,当然希望代价越小越好,你可以帮助他嘛?配送中心位于城镇S中(1<=S<=T)。

    输入格式

    输入的第一行包含四个用空格隔开的整数T,R,P,S。

    接下来R行,描述公路信息,每行包含三个整数,分别表示Ai,Bi和Ci。

    接下来P行,描述航路信息,每行包含三个整数,分别表示Ai,Bi和Ci。

    输出格式
    输出T行,分别表示从城镇S到每个城市的最小花费,如果到不了的话输出NO PATH。
    样例输入
    6 3 3 4
    1 2 5
    3 4 5
    5 6 10
    3 5 -100
    4 6 -100
    1 3 -10
    样例输出
    NO PATH
    NO PATH
    5
    0
    -95
    -100
    数据规模与约定

    对于20%的数据,T<=100,R<=500,P<=500;

    对于30%的数据,R<=1000,R<=10000,P<=3000;

    对于100%的数据,1<=T<=25000,1<=R<=50000,1<=P<=50000。

    ford 85分,3个测试数据超时

    #include"cstdio"
    using namespace std;
    const int MAXN=150005;
    const int INF=0x3fffffff;
    int T,R,P,S;
    int E;
    struct Edge{
        int from,to,cost;
    }es[MAXN];
    int d[MAXN];
    void ford()
    {
        for(int i=0;i<=T;i++)    d[i]=INF;
        d[S]=0;
        while(true)
        {
            bool update=false;
            for(int i=0;i<E;i++)
            {
                Edge e=es[i];
                if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost)
                {
                    d[e.to]=d[e.from]+e.cost;
                    update=true;
                }
            }
            if(!update)    break;
        }    
    }
    int main()
    {
        scanf("%d%d%d%d",&T,&R,&P,&S);
        for(int i=0;i<R;i++)
        {
            int from,to,cost;
            scanf("%d%d%d",&from,&to,&cost);
            es[E].from=from,es[E].to=to,es[E++].cost=cost;
            es[E].from=to,es[E].to=from,es[E++].cost=cost;
        }
        for(int i=0;i<P;i++)
        {
            int from,to,cost;
            scanf("%d%d%d",&from,&to,&cost);
            es[E].from=from,es[E].to=to,es[E++].cost=cost;
        }
        ford();
        for(int i=1;i<=T;i++)
        {
            if(d[i]>=INF)    printf("NO PATH
    ");
            else printf("%d
    ",d[i]);
        }
        
        return 0;
    }
    编译信息
    详细记录
    评测点序号评测结果得分CPU使用内存使用下载评测数据
    1 正确 5.00 0ms 3.898MB 输入 输出
    2 正确 5.00 0ms 3.898MB VIP特权
    3 正确 5.00 0ms 3.898MB VIP特权
    4 正确 5.00 15ms 3.898MB VIP特权
    5 正确 5.00 15ms 3.898MB VIP特权
    6 正确 5.00 31ms 3.906MB VIP特权
    7 正确 5.00 140ms 3.906MB VIP特权
    8 正确 5.00 249ms 3.906MB VIP特权
    9 正确 5.00 327ms 3.906MB VIP特权
    10 正确 5.00 530ms 3.906MB VIP特权
    11 正确 5.00 390ms 3.910MB VIP特权
    12 正确 5.00 452ms 3.906MB VIP特权
    13 正确 5.00 405ms 3.906MB VIP特权
    14 正确 5.00 436ms 3.910MB VIP特权
    15 运行超时 0.00 运行超时 3.906MB VIP特权
    16 运行超时 0.00 运行超时 3.902MB VIP特权
    17 正确 5.00 405ms 3.906MB VIP特权
    18 正确 5.00 296ms 3.906MB VIP特权
    19 运行超时 0.00 运行超时 3.902MB VIP特权
    20 正确 5.00 421ms 3.910MB VIP特权
    #include"cstdio"
    #include"vector"
    #include"queue"
    using namespace std;
    const int MAXN=25005;
    const int INF=0X3fffffff;
    typedef pair<int,int> P;
    int T,R,p,S;
    vector<P> G[MAXN];
    int d[MAXN];
    int vis[MAXN];
    void spfa(int s)
    {
        for(int i=1;i<=T;i++)    d[i]=INF;
        queue<int> que;
        d[s]=0,vis[s]=1,que.push(s);
        
        while(!que.empty())
        {
            int v=que.front();que.pop();
            vis[v]=0;
            for(int i=0;i<G[v].size();i++)
            {
                P e=G[v][i];
                if(d[e.second]>d[v]+e.first)
                {
                    d[e.second]=d[v]+e.first;
                    if(!vis[e.second])
                    {
                        vis[e.second]=1;
                        que.push(e.second);
                    }
                }
            }
        }    
    }
    int main()
    {
        scanf("%d%d%d%d",&T,&R,&p,&S);
        for(int i=0;i<R;i++)
        {
            int u,v,t;
            scanf("%d%d%d",&u,&v,&t);
            G[u].push_back(P(t,v));
            G[v].push_back(P(t,u));
        }
        for(int i=0;i<p;i++)
        {
            int u,v,t;
            scanf("%d%d%d",&u,&v,&t);
            G[u].push_back(P(t,v));
        }
        spfa(S);
        for(int i=1;i<=T;i++)
        {
            if(d[i]>=INF)    printf("NO PATH
    ");
            else printf("%d
    ",d[i]);
        }
        
        return 0;
    }
    详细记录
    评测点序号评测结果得分CPU使用内存使用下载评测数据
    1 正确 5.00 0ms 2.460MB 输入 输出
    2 正确 5.00 0ms 2.472MB VIP特权
    3 正确 5.00 0ms 2.468MB VIP特权
    4 正确 5.00 0ms 2.496MB VIP特权
    5 正确 5.00 15ms 2.597MB VIP特权
    6 正确 5.00 46ms 3.226MB VIP特权
    7 正确 5.00 124ms 3.828MB VIP特权
    8 正确 5.00 202ms 4.414MB VIP特权
    9 正确 5.00 296ms 4.898MB VIP特权
    10 正确 5.00 811ms 5.117MB VIP特权
    11 正确 5.00 436ms 5.148MB VIP特权
    12 正确 5.00 514ms 5.101MB VIP特权
    13 正确 5.00 499ms 4.304MB VIP特权
    14 正确 5.00 374ms 4.187MB VIP特权
    15 运行超时 0.00 运行超时 3.335MB VIP特权
    16 运行超时 0.00 运行超时 4.855MB VIP特权
    17 正确 5.00 358ms 5.101MB VIP特权
    18 正确 5.00 343ms 4.902MB VIP特权
    19 正确 5.00 686ms 4.804MB VIP特权
    20 正确 5.00 499ms 4.304MB VIP特权

    spfa比ford 快一点。

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5146411.html
Copyright © 2011-2022 走看看