zoukankan      html  css  js  c++  java
  • 飞行路线(BZOJ 2763)

    题目描述

    Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?

    输入

    数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。
    第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。(0<=s,t<n)
    接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。(0<=a,b<n,a与b不相等,0<=c<=1000)
     

    输出

     
    只有一行,包含一个整数,为最少花费。

    样例输入

    5 6 1
    0 4
    0 1 5
    1 2 5
    2 3 5
    3 4 5
    2 3 3
    0 2 100

    样例输出

    8

    提示

    对于30%的数据,2<=n<=50,1<=m<=300,k=0;


    对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;


    对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.

    /*
      分层图最短路
      建k+1层图,对于每条边都和它下一层图建一条边权为0的边,
      然后进行优先队列优化的Dij 
    */
    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<vector>
    #include<cstring>
    #define mk make_pair
    #define pa pair<int,int>
    #define M 2000010
    using namespace std;
    int n,m,k,s,t,num,head[M],dis[M],c[M];
    int x[M],y[M],z[M],ans=0xfffffff;
    priority_queue<pa,vector<pa>,greater<pa> >q;
    bool f[M];
    struct node
    {
        int u,v,pre,t;
    };node e[M];
    void add(int x,int y,int z)
    {
        for(int i=head[x];i;i=e[i].pre)
          if(e[i].v==y)
          {
              e[i].t=min(e[i].t,z);
              return;
          }
        num++;
        e[num].u=x;
        e[num].v=y;
        e[num].t=z;
        e[num].pre=head[x];
        head[x]=num;
    }
    void Dij(int x)
    {
        memset(dis,127/3,sizeof(dis));
        dis[x]=0;q.push(mk(0,x));
        while(!q.empty())
        {
            int d=q.top().first;
            int k=q.top().second;
            q.pop();
            if(f[k])continue;f[k]=1;
            for(int i=head[k];i;i=e[i].pre)
            {
                int v=e[i].v;
                if(dis[v]>dis[k]+e[i].t)
                {
                    dis[v]=dis[k]+e[i].t;
                    q.push(mk(dis[v],v));
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
        s++;t++;n=n*(k+1);
        for(int i=1;i<=m;i++)
          scanf("%d%d%d",&x[i],&y[i],&z[i]),
          x[i]++,y[i]++;
        for(int i=1;i<=m;i++)
          for(int j=1;j<=k+1;j++)
          {
              add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j,z[i]);
              add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j,z[i]);
              if(j<=k)
              {
                  add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j+1,0);
                  add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j+1,0);
              }
          }
        Dij((s-1)*(k+1)+1);
        for(int j=1;j<=k+1;j++)
          ans=min(ans,dis[(t-1)*(k+1)+j]);
        printf("%d",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    mysql decimal(10,2)对应java类型
    idea maven 配置spring boot dev-tools热部署
    在CentOS 8上安装Java 11(OpenJDK 11)和Java 8(OpenJDK 8)的方法
    关于mybatis-plus中Service和Mapper的分析
    Springboot测试类之@RunWith注解
    Get bit field from buffer as an integer / Set bit field in buffer from an integer
    A generic doubly linked list implementation
    Array helper
    Base64 Encoding/Decoding
    ffmpeg color_table[]
  • 原文地址:https://www.cnblogs.com/harden/p/5719741.html
Copyright © 2011-2022 走看看