zoukankan      html  css  js  c++  java
  • HDU 4725

    http://acm.hdu.edu.cn/showproblem.php?pid=4725

    求1-n最短路,每个点有一个层数,相邻层之间花费k可以到达

    建图时把层数看成n个点,层到该层点距离为0,点到其相邻层距离为c,相邻层之间距离为c

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <vector>
    using namespace std ;
    const int INF=0xfffffff ;
    struct Edge{
        int s,t,v,nxt ;
    }e[1000005] ;
    int n,m,cnt,head[1000005],dis[1000005],vis[1000005] ;
    void add(int s,int t,int v)
    {
        e[cnt].s=s ;e[cnt].t=t ;e[cnt].v=v ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
    }
    struct Heap{
        int s,d ;
        friend bool operator <(Heap a,Heap b)
        {
            return a.d>b.d ;
        }
    } ;
    int Dijkstra(int s,int t,int N) 
    {
        memset(vis,0,sizeof(vis)) ;
        for(int i=1 ;i<=N ;i++) 
                dis[i]=INF ;
        dis[s]=0 ;
        priority_queue <Heap> q ;
        Heap st ;
        st.s=s ;st.d=dis[s] ;
        q.push(st) ;
        while(!q.empty())
        {
            Heap u=q.top() ;
            q.pop() ;
            if(u.s==t)return u.d ;
            if(vis[u.s])continue ;
            vis[u.s]=1 ;
            for(int i=head[u.s] ;i!=-1 ;i=e[i].nxt)
            {
                int tt=e[i].t ;
                if(!vis[tt] && dis[tt]>e[i].v+dis[u.s])
                {
                    dis[tt]=e[i].v+dis[u.s] ;
                    Heap ttt ;
                    ttt.s=tt ;ttt.d=dis[tt] ;
                    q.push(ttt) ;
                }
            }
        } 
        return -1 ;
    }
    int flag[1000005],L[1000005] ;
    int main()
    {
        int t ;
        scanf("%d",&t) ;
        for(int cas=1 ;cas<=t ;cas++)
        {
            cnt=0 ;
            memset(head,-1,sizeof(head)) ;
            int c ;
            scanf("%d%d%d",&n,&m,&c) ;
            memset(flag,0,sizeof(flag)) ;
            for(int i=1 ;i<=n ;i++)
            {
                scanf("%d",&L[i]) ;
                flag[L[i]+n]=1 ;
                add(L[i]+n,i,0) ;
            }
            for(int i=1 ;i<=n ;i++)
            {
                if(L[i]>1 && flag[L[i]+n-1])add(i,L[i]+n-1,c) ;
                if(L[i]<n && flag[L[i]+n+1])add(i,L[i]+n+1,c) ;
            }
            for(int i=n+1 ;i<2*n ;i++)
            {
                if(flag[i] && flag[i+1])
                {
                    add(i,i+1,c) ;
                    add(i+1,i,c) ;
                }
            }
            while(m--)
            {
                int s,t,v ;
                scanf("%d%d%d",&s,&t,&v) ;
                add(s,t,v) ;add(t,s,v) ;
            }
            printf("Case #%d: %d
    ",cas,Dijkstra(1,n,2*n)) ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    论文阅记 YOLOv4: Optimal Speed and Accuracy of Object Detection
    【项目实战】yolov3-tiny人脸数据模型训练
    面试题54. 二叉搜索树的第k大节点
    102. 二叉树的层序遍历
    107. 二叉树的层次遍历 II
    连续子数组的最大和
    172. 阶乘后的零
    26 进制
    405. 数字转换为十六进制数
    504. 七进制数
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3737998.html
Copyright © 2011-2022 走看看