P4568 [JLOI2011]飞行路线 题解(分层图模板)

题目链接

题目思路

这就是分层图啊,其实感觉就是多维最短路而已

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
#define fi first
#define se second
#define debug printf("aaaaaaaaaaa\n");
const int maxn=5e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const ll INF=0x3f3f3f3f3f3f3f3f;
const double eps=1e-7;
int n,m,k;
int s,t;
int head[maxn],cnt;
int dis[maxn][15];
struct edge{
    int to,next,w;
}e[maxn<<1];
void add(int u,int v,int w){
    e[++cnt]={v,head[u],w};
    head[u]=cnt;
}
struct node{
    int len,pos,free;
    friend bool operator<(node a, node b){
        return a.len>b.len;
    }
};
void dij(int x){
	priority_queue<node> que;
	memset(dis,0x3f,sizeof(dis));
	dis[x][0]=0;
	que.push({0,x,0});
	while(!que.empty()){
		int len=que.top().len;
		int pos=que.top().pos;
		int free=que.top().free;
		que.pop();
		if(len!=dis[pos][free]) continue;
        for(int i=head[pos];i;i=e[i].next){
            if(dis[e[i].to][free]>dis[pos][free]+e[i].w){
                dis[e[i].to][free]=dis[pos][free]+e[i].w;
                que.push({dis[e[i].to][free],e[i].to,free});//一定注意是len为fi
            }
            if(free<k){
                 if(dis[e[i].to][free+1]>dis[pos][free]){
                    dis[e[i].to][free+1]=dis[pos][free];
                    que.push({dis[e[i].to][free+1],e[i].to,free+1});//一定注意是len为fi
                }
            }
        }

	}
}
int main(){
    cin>>n>>m>>k;
    cin>>s>>t;
    for(int i=1,u,v,w;i<=m;i++){
        cin>>u>>v>>w;
        add(u,v,w),add(v,u,w);
    }
    dij(s);
    int ans=inf;
    for(int i=0;i<=k;i++){
        ans=min(ans,dis[t][i]);
    }
    printf("%d\n",ans);
    return 0;
}

posted @ 2021-08-02 17:02  hunxuewangzi  阅读(36)  评论(0编辑  收藏  举报