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 |
Re:太多了,反正我是用unsigned _int64 过的……In Reply To:TLE,Dijkstra using heap,why TLE? Posted by:kenin at 2006-10-25 22:19:17 > #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