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
  • 相关阅读:
    Winform 切换语言 实现多语言版本
    PowerDesigner导出表到word
    【SQL】两个带order by查询进行union all报ORA-00933错误的解决方法
    读写txt文件
    c# 进度条的使用(例子)、线程
    设计模式——策略模式
    设计模式——简单工厂模式
    解决JSP路径问题的方法(jsp文件开头path, basePath作用)
    反射
    Struts2中的valuestack
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3737998.html
Copyright © 2011-2022 走看看