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 |
谁能告诉我我的A*为甚么超时?看出来的mail我,谢谢#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define N 10010 #define M 1000100 #define QM 5000010 int n,m; int st,ed,k; struct arr{ int ff,tt,ww,next; }c1[M],c[M]; int r1[M],r[M]; int tot1 = 0,tot = 0; int dis[N],d[N]; bool v[N]; struct ar{ struct data{ int xx,ww; }h[QM]; int s; void clean(){ memset(h,0,sizeof(h)); s = 0; } void up(int x){ int p = x >> 1; while (p){ if (h[p].ww > h[x].ww) swap(h[p],h[x]); else return; x = p; p = x >> 1; } return; } void push(int x,int w){ h[++s].xx = x; h[s].ww = w; if (s == 1) return; up(s); } void down(int x){ int p = x << 1; while (p <= s){ if (h[p].ww > h[p + 1].ww && p < s) p++; if (h[p].ww < h[x].ww) swap(h[p],h[x]); else return; x = p; p = x << 1; } } int size(){ return s; } data top(){ return h[1]; } void pop(){ h[1] = h[s --]; if (!s) return; down(1); } }Q; struct arrr{ struct data{ int xx,ww; }h[QM]; int s; void clean(){ memset(h,0,sizeof(h)); s = 0; } void up(int x){ int p = x >> 1; while (p){ if (h[p].ww + dis[h[p].xx]> dis[h[x].xx]+h[x].ww) swap(h[p],h[x]); else return; x = p; p = x >> 1; } return; } void push(int x,int w){ h[++s].xx = x; h[s].ww = w; if (s == 1) return; up(s); } void down(int x){ int p = x << 1; while (p <= s){ if (h[p].ww + dis[h[p].xx]> h[p + 1].ww + dis[h[p + 1].xx] && p < s) p++; if (h[p].ww + dis[h[p].xx]< h[x].ww + dis[h[x].xx]) swap(h[p],h[x]); else return; x = p; p = x << 1; } } int size(){ return s; } data top(){ return h[1]; } void pop(){ h[1] = h[s --]; if (!s) return; down(1); } }QQ; inline void add(int x,int y,int z){ c[++tot].ff = x; c[tot].tt = y; c[tot].ww = z; c[tot].next = r[x]; r[x] = tot; return ; } inline void add1(int x,int y,int z){ c1[++tot1].ff = x; c1[tot1].tt = y; c1[tot1].ww = z; c1[tot1].next = r1[x]; r1[x] = tot1; return; } inline int getint(){ char ch; int x = 0; while (!isdigit(ch = getchar())); x = ch - 48; while (isdigit(ch = getchar())) x = x * 10 + ch - 48; return x; } void heap_dijsktra(){ memset(dis,0x3f,sizeof(dis)); memset(v,0,sizeof(v)); dis[ed] = 0; Q.clean(); Q.push(ed,0); while (Q.size()){ int x = Q.top().xx; Q.pop(); if (v[x])continue; v[x] = 1; for (int i = r1[x]; i; i = c1[i].next){ int y = c1[i].tt; if (dis[y] > dis[x] + c1[i].ww){ dis[y] = dis[x] + c1[i].ww; Q.push(y,dis[y]); } } } return; } int ans; void A_star(){ QQ.clean(); QQ.push(st,0); while (d[ed] < k && QQ.size()){ int x = QQ.top().xx; d[x]++; if (d[ed] == k) { ans = QQ.top().ww; return; } if (d[x] <= k){ for (int i = r[x]; i ; i = c[i].next){ QQ.push(c[i].tt,c[i].ww + QQ.top().ww); } } QQ.pop(); } return; } int main(){ n = getint(); m = getint(); int x,y,z; for (int i = 1; i <= n; i++){ x = getint(); y = getint(); z = getint(); add(x,y,z); add1(y,x,z); } st = getint();ed = getint();k = getint(); if (st == ed) k++; heap_dijsktra(); A_star(); if (d[ed] == k) printf("%d\n",ans); else puts("-1"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator