zoukankan      html  css  js  c++  java
  • [JLOI2011]飞行路线

    [JLOI2011]飞行路线

    Time Limit: 10 Sec  Memory Limit: 128 MB

    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.

    题解:

    做k次SPFA,每次求去掉k条路径之后的最短路,因为可以递推:

    dist[y][k]=min(dist[x][k-1],dist[x][k]+edge[i].dis);

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,m,l,s,t;
    int head[10005],size=1;
    struct node
    {
        int next,to,dis;
    }edge[100005];
    void putin(int from,int to,int dis)
    {
        size++;
        edge[size].to=to;
        edge[size].dis=dis;
        edge[size].next=head[from];
        head[from]=size;
    }
    int dist[10005][11],vis[10005];
    void SPFA(int s,int k)
    {
        memset(vis,0,sizeof(vis));
        int i;
        queue<int>mem;
        mem.push(s);
        vis[s]=1;
        dist[s][k]=0;
        while(!mem.empty())
        {
            int x=mem.front();mem.pop();
            vis[x]=0;
            for(i=head[x];i!=-1;i=edge[i].next)
            {
                int y=edge[i].to,ok=0;
                if(k>0&&dist[y][k]>dist[x][k-1])
                {
                    dist[y][k]=dist[x][k-1];
                    ok=1;
                }
                if(dist[y][k]>dist[x][k]+edge[i].dis)
                {
                    dist[y][k]=dist[x][k]+edge[i].dis;
                    ok=1;
                }
                if(ok&&!vis[y])
                {
                    mem.push(y);
                    vis[y]=1;
                }
            }
        }
    }
    int main()
    {
        int i,j;
        memset(head,-1,sizeof(head));
        scanf("%d%d%d%d%d",&n,&m,&l,&s,&t);
        for(i=1;i<=m;i++)
        {
            int from,to,dis;
            scanf("%d%d%d",&from,&to,&dis);
            putin(from,to,dis);putin(to,from,dis);
        }
        memset(dist,127/3,sizeof(dist));
        for(i=0;i<=l;i++)
            SPFA(s,i);
        printf("%d",dist[t][l]);
        return 0;
    }
  • 相关阅读:
    怎么让Windows2012和Windows2008多用户同时远程
    IIS站点/虚拟目录中访问共享目录(UNC)以及建立后的应用程序的信任级别问题
    Mac 快捷键
    SQL Server Profiler
    vscode 实用插件
    Xss测试
    RequireJS和AMD规范
    ECMAScript 6.0 学习笔记
    使用 create-react-app 构建 react应用程序
    vscode 快捷键
  • 原文地址:https://www.cnblogs.com/huangdalaofighting/p/7376499.html
Copyright © 2011-2022 走看看