http://poj.org/problem?id=3377
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #define N 2000005 using namespace std; const __int64 INF=999999999999999999LL; struct node { int v,next; __int64 w; }edge[N*4],u,tmp; __int64 dis[N]; int vis[N],head[N],tot,n; priority_queue<node> Q; bool operator <(const node &a,const node &b) { return a.w>b.w; } void add(int s,int t,int w) { edge[tot].next=head[s]; edge[tot].v=t; edge[tot].w=w; head[s]=tot++; edge[tot].next=head[t]; edge[tot].v=s; edge[tot].w=w; head[t]=tot++; } void spfa(int ori,int dest) { int i,j,k; for(i=0;i<=2*n;i++){ dis[i]=INF; vis[i]=0;} tmp.v=ori; tmp.w=0; Q.push(tmp); vis[ori]=1; dis[ori]=0; while(!Q.empty()) { u=Q.top(); Q.pop(); vis[u.v]=0; for(j=head[u.v];j!=-1;j=edge[j].next) { k=edge[j].v; if(edge[j].w+dis[u.v]<dis[k]) { dis[k]=edge[j].w+dis[u.v]; if(!vis[k]) { vis[k]=1; tmp.v=k; tmp.w=dis[k]; Q.push(tmp); } } } } printf("%I64d\n",dis[dest]); } int main(void) { int m,i,j,a,s,b,t,tim; while(scanf("%d",&m)&&m) { n=m+1; tot=0; for(i=0;i<=2*n;i++) head[i]=-1; scanf("%d%d%d%d",&a,&s,&b,&t); if(a==1) s+=n; if(b==1) t+=n; for(i=1;i<=m;i++) { scanf("%d",&tim); add(i-1,i,tim); } for(i=0;i<=m;i++) { scanf("%d",&tim); add(i,i+n,tim); } for(i=1;i<=m;i++) { scanf("%d",&tim); add(i+n-1,i+n,tim); } spfa(s,t); } return 0; }