zoukankan      html  css  js  c++  java
  • BZOJ 2763: [JLOI2011]飞行路线(最短路)

    这道题很明显是最短路,只需多加一维表示用了多少次免费的机会,然后其他的和最短路一样。

    ---------------------------------------------------------------------------------------

    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cstring>
    #define rep(i,n) for(int i=0;i<n;i++)
    #define clr(x,c) memset(x,c,sizeof(x))
    using namespace std;
    const int maxn=10000+5,maxk=10+5;
    const int inf=0x3f3f3f3f;
    struct DIJKSTRA {
    struct Edge {
    int from,to,dist;
    Edge(int f,int t,int d):from(f),to(t),dist(d) {}
    };
    struct node {
    int d,k,u;
    node(int _d,int _k,int _u):d(_d),k(_k),u(_u) {}
    bool operator < (const node &rhs) const {
    return d>rhs.d;
    }
    };
    int n,m,k;
    int d[maxn][maxk];
    int done[maxn][maxk];
    vector<int> g[maxn];
    vector<Edge> edges;
    void init(int _n,int _k) {
    n=_n; k=_k;
    rep(i,n) g[i].clear();
    edges.clear();
    }
    void addEdge(int from,int to,int dist) {
    edges.push_back( (Edge) {from,to,dist} );
    edges.push_back( (Edge) {to,from,dist} );
    m=edges.size();
    g[from].push_back(m-2);
    g[to].push_back(m-1);
    }
    int Dijkstra(int s,int t) {
    clr(d,inf); clr(done,0);
    priority_queue<node> q;
    rep(i,k+1) {
       d[s][i]=0;
       q.push((node){0,i,s});
    }
    while(!q.empty()) {
    node x=q.top(); q.pop();
    if(done[x.u][x.k]) continue;
    done[x.u][x.k]=1;
    rep(i,g[x.u].size()) {
    Edge &e=edges[g[x.u][i]];
    if(d[e.to][x.k]>d[x.u][x.k]+e.dist) {
    d[e.to][x.k]=d[x.u][x.k]+e.dist;
    q.push( (node) {d[e.to][x.k],x.k,e.to} );
    }
    if(x.k<k && d[e.to][x.k+1]>d[x.u][x.k]) {
    d[e.to][x.k+1]=d[x.u][x.k];
    q.push( (node) {d[e.to][x.k+1],x.k+1,e.to} );
    }
    }
    }
    int ans=inf;
    rep(i,k+1) ans=min(ans,d[t][i]);
    return ans;
    }
    };
    DIJKSTRA dijkstra;
    int main()
    {
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
    int n,m,k,s,t,u,v,d;
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    dijkstra.init(n,k);
    rep(i,m) {
    scanf("%d%d%d",&u,&v,&d);
    dijkstra.addEdge(u,v,d);
    }
    printf("%d ",dijkstra.Dijkstra(s,t));
    return 0;
    }

    --------------------------------------------------------------------------------------- 

    2763: [JLOI2011]飞行路线

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 979  Solved: 382
    [Submit][Status][Discuss]

    Description

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

    Input

    数据的第一行有三个整数,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)
     

    Output

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

    Sample Input

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

    Sample Output

    8

    HINT

    对于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.

  • 相关阅读:
    Discuz 网站移至 Ubuntu 14.04.4 LTS VPS 配置
    ubuntu的一些常用命令,测试版本:Ubuntu 12.04.5 LTS
    文本的水平对齐方式,带来的一系列问题
    庆祝我的Blog开张了,今天起和大家一起见证一款原生的富文本编辑组件FoxJsonRichView的诞生过程。
    竖直导航(一)
    测试
    第七次作业
    第六次作业
    第四次作业
    第五次作业
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/4357280.html
Copyright © 2011-2022 走看看