您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页分层图最短路 bzoj2763

分层图最短路 bzoj2763

来源:榕意旅游网

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.


题解:其实很简单,类似dp的思路,想象一个k层的图,每次转移可以转移到当前层的其他点,也可以瞬移到下一层的其他点。

具体实现方式为二维数组。dijkstra+堆优化+vector邻接表实现

下面是代码:

#include<bits/stdc++.h>
using namespace std;
int s,t,n,m,k,d[10000+10][11];
const int INF=INT_MAX/2-10;
typedef pair<int,int> pii;
vector<pii> G[10000+10];
bool visit[10000+10][11];
struct Node
{
    int id;
    int level;
    int dis;
    Node(int id,int level,int dis):id(id),level(level),dis(dis)
    {
 
    }
    bool operator <(const Node& X)const
    {
        return dis>X.dis;
    }
};
priority_queue<Node> pq;
int main(void)
{
    int a,b,c;
    cin>>n>>m>>k;
    cin>>s>>t;
    for(int i=0;i<n;i++)
        G[i].clear();
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back(make_pair(b,c));
        G[b].push_back(make_pair(a,c));
    }
    memset(visit,0,sizeof(visit));
    for(int i=0;i<n;i++)
        for(int j=0;j<=k;j++)
            d[i][j]=INF;
   // visit[s][0]=true;
    d[s][0]=0;//start from s,the zero level
    pq.push(Node(s,0,0));
    while(!pq.empty())
    {
        Node X=pq.top();
        pq.pop();
        int x=X.id;
        int lv=X.level;
        if(visit[x][lv]==true)
            continue;
        else
        {
            visit[x][lv]=true;
            vector<pii>::iterator it;
            for(it=G[x].begin();it!=G[x].end();it++)
            {
                int y=(*it).first;
                int u=(*it).second;
                //the same level
                if(u+d[x][lv]<d[y][lv])
                {
 
                    d[y][lv]=u+d[x][lv];
                    pq.push(Node(y,lv,d[y][lv]));
                }
                //the +1 level
                if(lv<k)
                    if(d[x][lv]<d[y][lv+1])
                    {
                        d[y][lv+1]=d[x][lv];
                        pq.push(Node(y,lv+1,d[y][lv+1]));
                    }
            }
        }
    }
    int ans=d[t][0];
    for(int i=0;i<=k;i++)
    {
        ans=min(ans,d[t][i]);
    }
    cout<<ans<<endl;
    return 0;
}


因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务