zoukankan      html  css  js  c++  java
  • 飞行路线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);
    }
    
  • 相关阅读:
    WCF相关
    MiniUI级联
    大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
    C# 复杂算法
    sql自定义日期函数,返回范围内日期和星期数表。
    RDLC开发笔记
    解决IE7和IE6不支持javaScript中的indexOf函数的问题
    Sql获取周、月、年的首尾时间。
    Sql Server中实现Mysql中的group_concat函数效果
    RDLC隔行变色的实现
  • 原文地址:https://www.cnblogs.com/Y15BeTa/p/10962183.html
Copyright © 2011-2022 走看看