飞行路线Luogu4568

  • 一维

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

int n,m,k,s,t,head[1000005],vis[1000005],dis[1000005],cnt;

struct edge{
    int v,w,next;
}e[5000005];

struct node{
    int dis,u;
    bool operator< (const node &x)const{return x.dis<dis;}
};

inline void add(int u,int v,int w){
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}

inline void dijkstra(){
    priority_queue<node> q;
    dis[s]=0;
    q.push((node){0,s});
    while(!q.empty()){
        int x=q.top().u;
        q.pop();
        if(vis[x])continue;
        vis[x]=1;
        for(int i=head[x];i!=-1;i=e[i].next){
            int y=e[i].v;
            if(dis[y]>dis[x]+e[i].w){
                dis[y]=dis[x]+e[i].w;
                if(!vis[y]){
                    q.push((node){dis[y],y});
                }
            }
        }
    }
}

int main(){
    memset(head,-1,sizeof(head));
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    for(int i=0;i<=n*(k+1);i++)dis[i]=2147483647;
    for(int i=1;i<=m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
        for(int j=1;j<=k;j++){
            add(a+(j-1)*n,b+j*n,0);
            add(b+(j-1)*n,a+j*n,0);
            add(a+n*j,b+n*j,c);
            add(b+n*j,a+n*j,c);
        }
    }
    for(int i=1;i<=k;i++){
        add(s+(i-1)*n,s+i*n,0);
    }
    dijkstra();
    printf("%d
",dis[t+k*n]);
}
  • 二维

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

int n,m,k,s,t,cnt,head[100005],dis[100005][15];

bool vis[100005][15];

struct edge{
    int v,w,next;
}e[200005];

struct node{
    int dis,u,time;
    bool operator<(const node &x)const{return x.dis<dis;}
};

inline void add(int u,int v,int w){
    e[++cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt;
}

inline void dijkstra(){
    priority_queue<node> q;
    memset(dis,0x3f,sizeof(dis));
    q.push((node){0,s,0});
    dis[s][0]=0;
    while(!q.empty()){
        node now=q.top();q.pop();
        if(vis[now.u][now.time])continue;
        vis[now.u][now.time]=1;
        for(int i=head[now.u];i!=-1;i=e[i].next){
            int v=e[i].v;
            if(dis[now.u][now.time]<dis[v][now.time+1]&&now.time+1<=k){
                dis[v][now.time+1]=dis[now.u][now.time];
                q.push((node){dis[now.u][now.time],v,now.time+1});
            }
            if(now.dis+e[i].w<dis[v][now.time]){
                dis[v][now.time]=now.dis+e[i].w;
                q.push((node){dis[v][now.time],v,now.time});
            }
        }
    }
}

inline int min(int x,int y){return x<y?x:y;}

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);
    }
    dijkstra();
    int ans=2147483647;
    for(int i=0;i<=k;i++)ans=min(ans,dis[t][i]);
    printf("%d
",ans);
}
原文地址:https://www.cnblogs.com/Y15BeTa/p/10962183.html