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:为什么MLE了In Reply To:为什么MLE了 Posted by:C111 at 2013-08-28 19:03:44 > #include <string.h> > #include <stdio.h> > #include <queue> > #include <vector> > using namespace std; > #define INF 0x3f3f3f3f > int n,m,SS,T,K,e; > int D[1005],S[1005]; > struct node > { > int v,w,next; > }edge[100009],revedge[100009]; > int head[1009],revhead[1009]; > struct Statement > { > int v,d,h; > bool operator <( Statement a )const > { return a.d+a.h<d+h; } > }; > void init() > { > e=0; > memset(head,0xff,sizeof(head)); > memset(revhead,0xff,sizeof(revhead)); > } > void AddEdge(int x,int y,int w) > { > edge[e].v=y; > edge[e].w=w; > edge[e].next=head[x]; > head[x]=e; > revedge[e].v = x; > revedge[e].w = w; > revedge[e].next =revhead[y]; > revhead[y] = e++; > } > void Dijkstra(int s) > { > S[s]=1; > D[s]=0; > > for(int i=revhead[s];i!=-1;i=revedge[i].next) > { > int v=revedge[i].v; > int w=revedge[i].w; > D[v]=w; > } > > for(int i=0;i<n-1;i++) > { > int j,minn=-1,w; > for(j=1;j<=n;j++) > { > if(!S[j]&&D[j]>=0) > { > if(minn<0||minn>D[j]) > { > minn=D[j]; > w=j; > } > } > } > if(minn<0)break; > S[w]=1; > > for(int ii=revhead[w];ii!=-1;ii=revedge[ii].next) > { > > int v=revedge[ii].v; > int ww=revedge[ii].w; > if(D[v]<0||D[v]>D[w]+ww) > { > D[v]=D[w]+ww; > } > > } > > } > } > int Astar_Kth(int s,int e) > { > Statement cur,nxt; > priority_queue<Statement>q; > int cnt[1005]; > memset( cnt,0,sizeof(cnt) ); > cur.v=s; > cur.d=0; > cur.h=D[s]; > q.push(cur); > while(!q.empty()) > { > cur=q.top(); > q.pop(); > cnt[cur.v]++; > if( cnt[cur.v]>K ) continue; > if( cnt[e]==K )return cur.d; > > for(int i=revhead[cur.v];i!=-1;i=revedge[i].next) > { > int v=revedge[i].v; > int w=revedge[i].w; > nxt.v=v; > nxt.d=cur.d+w; > nxt.h=D[v]; > q.push(nxt); > > } > } > return -1; > } > int main() > { > int x,y,w,i; > while(scanf("%d %d",&n,&m)!=EOF) > { > > init(); > for(i=0;i<m;i++) > { > scanf("%d %d %d",&x,&y,&w); > AddEdge(x,y,w); > } > > scanf("%d %d %d",&SS,&T,&K); > if(SS==T)K++; > for(i=1;i<=n;i++) > { > > D[i]=INF; > } > memset(S,0,sizeof(S)); > Dijkstra(SS); > > > printf("%d\n",Astar_Kth(T,SS)); > > } > return 0; > } > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator