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 |
TLE,Dijkstra using heap,why TLE?#include <cstdio> const long MaxN=50000; const long MaxM=50000; struct node { long a,m; }; long T; node heap[2*MaxM]; long count; long N,M; long min[MaxN],head[MaxN],minpoint; long point[MaxM*2],next[MaxM*2],dis[MaxM*2]; long cost[MaxN],weight[MaxN]; __int64 ans; bool noanswer; void Open() { freopen ("3013.in","r",stdin); freopen ("3013.out","w",stdout); } void Close() { fclose(stdin); fclose(stdout); } inline void swap(long a,long b) { node temp; temp=heap[a]; heap[a]=heap[b]; heap[b]=temp; } inline long Min(long a,long b) { if (heap[a].a<heap[b].a) return a; return b; } void Up(long k) { long f,t; f=(k-1)/2; while (k!=0) { t=Min(f,k); if (t==f) break; swap(k,f); k=f; } } void Down(long k) { long l,r,t; while (1) { l=k*2+1; r=k*2+2; if (l>=count) break; if (r>=count) t=Min(k,l); else t=Min(k,Min(l,r)); if (t==k) break; swap(k,t); k=t; } } void Dijkstra_Heap() { long i,j; minpoint=0; for (i=0;i<N;i++) min[i]=-1; min[0]=0; count=0; i=0; while (min[minpoint]>=0&&i<=N) { j=head[minpoint]; while (j!=-1) { if (min[minpoint]+dis[j]<min[point[j]]||min[point[j]]==-1) { min[point[j]]=min[minpoint]+dis[j]; heap[count].a=min[point[j]]; heap[count].m=point[j]; count++; Up(count-1); } j=next[j]; } cost[minpoint]=min[minpoint]; min[minpoint]=-2; minpoint=heap[0].m; while (min[minpoint]==-2&&count>0) { heap[0]=heap[--count]; Down(0); minpoint=heap[0].m; } i++; } } void init() { long i,a,b,c,tcount=0; scanf ("%ld%ld",&N,&M); for (i=0;i<N;i++) head[i]=-1; for (i=0;i<2*M;i++) next[i]=-1; count=0; ans=0; noanswer=false; for (i=0;i<N;i++) scanf ("%ld",&weight[i]); for (i=0;i<M;i++) { scanf ("%ld%ld%ld",&a,&b,&c); a--; b--; if (a==b) continue; point[tcount]=b; next[tcount]=head[a]; dis[tcount]=c; head[a]=tcount++; point[tcount]=a; next[tcount]=head[b]; dis[tcount]=c; head[b]=tcount++; } } void work() { long i; __int64 a,b,c; for (i=0;i<N;i++) cost[i]=-1; Dijkstra_Heap(); for (i=0;i<N;i++) if (cost[i]==-1) {noanswer=true; return;} for (i=0;i<N;i++) { a=cost[i]; b=weight[i]; c=a*b; ans+=c; } } void output() { if (noanswer) printf ("No Answer\n"); else printf ("%I64d\n",ans); } int main() { // Open(); scanf ("%ld",&T); for (;T>0;T--) { init(); work(); output(); } // Close(); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator