P4568 [JLOI2011] 飞行路线

原题链接

题解

分层图最短路模板题

code

 

复制代码
#include<bits/stdc++.h>
using namespace std;
struct Node{
    int way,key,value;
    bool operator >(const Node &a)const{
        return value>a.value;
    }
};
const int N=1e4+5;
const int M=1e5+5;
const int MAX=5e8;
int head[N],Next[M],to[M],w[M],vis[N][12],dis[N][12];
int n,m,k,cnt=1,s,t;
void initial(){
    for (int i=0;i<n;i++){
        for (int j=0;j<=k;j++){
            dis[i][j]=MAX;
            vis[i][j]=0;
        }
    }
}
void build(int a,int b,int c){
    Next[cnt]=head[a];
    to[cnt]=b;
    w[cnt]=c;
    head[a]=cnt++;
}
int main(){
    cin>>n>>m>>k;
    cin>>s>>t;
    initial();
    for (int i=1;i<=m;i++) {
        int a,b,c;
        cin>>a>>b>>c;
        build(a,b,c);
        build(b,a,c);
    }
    priority_queue<Node,vector<Node>,greater<Node> > que;
    Node x;
    x.way=s;x.value=0;x.key=0;
    dis[s][0]=0;
    que.push(x);
    while (!que.empty()){
        x=que.top();que.pop();
        if (vis[x.way][x.key]) continue;
        vis[x.way][x.key]=1;
        if (x.way==t) {
            cout<<x.value<<endl;
            break;
        }
        for (int i=head[x.way];i>0;i=Next[i]){
            if (x.key<k){
                if (!vis[to[i]][x.key+1] && x.value<dis[to[i]][x.key+1]){
                    dis[to[i]][x.key+1]=x.value;
                    Node y;
                    y.way=to[i];y.value=x.value;y.key=x.key+1;
                    que.push(y);
                }
            }
            if (!vis[to[i]][x.key] && x.value+w[i]<dis[to[i]][x.key]){
                dis[to[i]][x.key]=x.value+w[i];
                Node y;
                y.way=to[i];y.value=x.value+w[i];y.key=x.key;
                que.push(y);
            }
        }
    }
    return 0;
}
复制代码

 

posted @   黑屿白  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示