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\n",cas,Dijkstra(1,n,2*n)) ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(HDU)