P4568 flight path

Questions surface: https://www.luogu.org/problem/P4568

本题是分层图裸题

Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<queue>
using namespace std;
const int N=5000005;
int n,m,k,s,t,cnt,Next[N],head[N],to[N],val[N],dis[N];
bool visit[N];
struct Node{
    int id,dis;
    friend bool operator<(Node x,Node y){
        return x.dis>y.dis;
    }
};
priority_queue<Node> Q;
void add(int x,int y,int z){
    to[cnt]=y;
    val[cnt]=z;
    Next[cnt]=head[x];
    head[x]=cnt++;
}
void dijkstra(){
    memset(dis,0x3f,sizeof(dis));
    memset(visit,0,sizeof(visit));
    Q.push((Node){s,0});
    dis[s]=0;
    while(!Q.empty()){
        int u=Q.top().id;
        Q.pop();
        if(visit[u]){
            continue;
        }
        visit[u]=true;
        for (int i=head[u];i!=-1;i=Next[i]){
            int v=to[i];
            if(dis[v]>dis[u]+val[i]){ 
                dis[v]=dis[u]+val[i];
                if(!visit[v]){
                    Q.push((Node){v,dis[v]});
                }
            }
        }
    }
}
int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
        for(int j=1;j<=k;j++){
            add(x+(j-1)*n,y+j*n,0);
            add(y+(j-1)*n,x+j*n,0);
            add(x+j*n,y+j*n,z);
            add(y+j*n,x+j*n,z);
        }
    }
    for(int i=1;i<=k;i++){
        add(t+(i-1)*n,t+i*n,0);
    }
    dijkstra();
    printf("%d\n",(m<k?0:dis[t+n*k]));
    return 0;
}

Guess you like

Origin www.cnblogs.com/ukcxrtjr/p/11318819.html