Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Dijkstra+Heap怎么会TLE啊In Reply To:图很特殊,更好的算法是O(N)的DP Posted by:Dzx at 2007-09-12 09:32:07 还有就是用链表好像比数组慢得多,但我改成数组后还是TLE啊TLE #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MaxN 2000023 #define INF 0x7FFFFFFFFFFFFFFF int n; int sv,tv; struct NODE { int ID; __int64 EW; }a[MaxN][3]; int an[MaxN]; struct HeapType{__int64 vop;int h2n;} heap[MaxN]; int n2h[MaxN]; int hn; int HeapSwap(int ix,int jx) { __int64 temp; int vx,ux; int tempv; temp=heap[ix].vop; heap[ix].vop=heap[jx].vop; heap[jx].vop=temp; vx=heap[ix].h2n; ux=heap[jx].h2n; tempv=n2h[vx]; n2h[vx]=n2h[ux]; n2h[ux]=tempv; tempv=heap[ix].h2n; heap[ix].h2n=heap[jx].h2n; heap[jx].h2n=tempv; return 0; } int Heapify(int ix) { int jx; /*up adjust*/ jx=0; while (ix/2>=1 && heap[ix].vop<heap[ix/2].vop) { HeapSwap(ix,ix/2); ix=ix/2; } /*else,down adjust*/ jx=ix; do { ix=jx; if (ix*2<=hn && heap[ix*2].vop<heap[ix].vop) jx=ix*2; if (ix*2+1<=hn && heap[ix*2+1].vop<heap[ix].vop) jx=ix*2+1; if (ix!=jx) HeapSwap(ix,jx); } while (ix!=jx); return 0; } int Relax(int ix,__int64 wt,int jx) { if (heap[ix].vop+wt<heap[jx].vop) { heap[jx].vop=heap[ix].vop+wt; Heapify(jx); } return 0; } __int64 Dijkstra() { int ix; int ux,vx; memset(n2h,-1,sizeof(n2h)); hn=1; n2h[sv]=hn; heap[n2h[sv]].vop=0; heap[n2h[sv]].h2n=sv; while (hn) { if (heap[1].h2n==tv) return heap[1].vop; heap[0].vop=heap[1].vop; ux=heap[1].h2n; HeapSwap(1,hn); hn--; Heapify(1); n2h[ux]=0; for (ix=0;ix<=an[ux];ix++) { vx=a[ux][ix].ID; if (n2h[vx]==-1) { hn++; n2h[vx]=hn; heap[n2h[vx]].h2n=vx; heap[n2h[vx]].vop=INF; } if (n2h[vx]) Relax(0,a[ux][ix].EW,n2h[vx]); } } return INF; } int InsertNode(int ux,int vx,__int64 wtxx) { an[ux]++; a[ux][an[ux]].ID=vx; a[ux][an[ux]].EW=wtxx; return 0; } int GetData() { int ns; int u; __int64 wtx; int sf,tf,sbt; n=0; scanf("%d",&n); if (n==0) return 0; memset(a,0,sizeof(a)); memset(an,0,sizeof(an)); n++; scanf("%d%d",&ns,&u); sv=ns*n+u+1; scanf("%d%d",&ns,&u); tv=ns*n+u+1; if ((sv-1)%n<(tv-1)%n) sbt=1; else sbt=0; sf=(sv-1)%n+1; tf=(tv-1)%n+1; if (!sbt) { sf=(tv-1)%n+1; tf=(sv-1)%n+1; } for (u=1;u<=n-1;u++) { scanf("%I64d",&wtx); if (u>=sf && u<=tf-1) { if (sbt) InsertNode(u,u+1,wtx); else InsertNode(u+1,u,wtx); } else if (u<sf) { if ((sbt && (sv-1)/n==0) || (!sbt && (tv-1)/n==1)) InsertNode(u+1,u,wtx); else InsertNode(u,u+1,wtx); } else { if ((sbt && (tv-1)/n==0) || (!sbt && (sv-1)/n==1)) InsertNode(u+1,u,wtx); else InsertNode(u,u+1,wtx); } } for (u=1;u<=n;u++) { scanf("%I64d",&wtx); if (u<=sf) { if ((sbt && (sv-1)/n==0) || (!sbt && (tv-1)/n==1)) InsertNode(u,n+u,wtx); else InsertNode(n+u,u,wtx); } else if (u>=tf) { if ((sbt && (tv-1)/n==1) || (!sbt && (sv-1)/n==0)) InsertNode(u,n+u,wtx); else InsertNode(n+u,u,wtx); } else { InsertNode(u,n+u,wtx); InsertNode(n+u,u,wtx); } } for (u=1;u<=n-1;u++) { scanf("%I64d",&wtx); if (u>=sf && u<=tf-1) { if (sbt) InsertNode(n+u,n+u+1,wtx); else InsertNode(n+u+1,n+u,wtx); } else if (u<sf) { if ((sbt && (sv-1)/n==0) || (!sbt && (tv-1)/n==1)) InsertNode(n+u,n+u+1,wtx); else InsertNode(n+u+1,n+u,wtx); } else { if ((sbt && (tv-1)/n==0) || (!sbt && (sv-1)/n==1)) InsertNode(n+u,n+u+1,wtx); else InsertNode(n+u+1,n+u,wtx); } } n=n*2; return 1; } int main() { while (GetData()) { printf("%I64d\n",Dijkstra()); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator