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 |
AC#include<iostream> #include<cstdlib> #include<cstdio> #include<queue> #include<cmath> #include<cstring> using namespace std; const int maxedge=2200000; const int maxnode=2100000; int nodecount,edgecount,s,t,k; int dis[maxnode],from[maxnode],to[maxnode],val[maxnode]; /////////////////////图信息 struct edgenode{ int to,dis,next; }e[maxedge]; int head[maxnode],tot; void edge(int u,int v,int w) { e[++tot].to=v; e[tot].dis=w; e[tot].next=head[u]; head[u]=tot; } ///////////////邻接表 struct Node{ int num,dist; int g,h; Node(int x,int y){ num=x;dist=y; } Node(int x,int y,int z){ num=x,g=y,h=z; dist=g+h; } bool operator < (const Node &x)const{ return dist>x.dist; } }; void dijkstra(int s) { priority_queue<Node> que; memset(dis,127/3,sizeof(dis)); dis[s]=0; que.push(Node(s,0)); while(!que.empty()){ Node node=que.top();que.pop(); s=node.num; if(node.dist != dis[s]) continue; int x=head[s]; while(x!=0){ int to=e[x].to; if(dis[to]> dis[s]+e[x].dis){ dis[to]=dis[s]+e[x].dis; que.push(Node(to,dis[to])); } x=e[x].next; } } } ////////////////dijkstra void clear() { memset(head,0,sizeof(head)); memset(e,0,sizeof(e)); //for(int i=1;i<=tot;i++){ // cout<<e[i].next<<e[i].dis<<e[i].to; // } tot=0; } void secondedge() { for(int i=1;i<=edgecount;i++) edge(from[i],to[i],val[i]); } int Astar(int s,int t,int k) { if(s==t) k++; dijkstra(t); priority_queue<Node>q; clear(); secondedge(); q.push(Node(s,0,dis[s])); while(!q.empty()){ Node x=q.top();q.pop(); if(x.num==t){ k--; if(k==0){ return x.g; } } int xx=head[x.num]; while(xx!=0){ q.push(Node( e[xx].to , x.g+e[xx].dis , dis[e[xx].to] )); xx=e[xx].next; } } return -1; } ///////////////////Astar int main() { //freopen("cowjog.in","r",stdin); // freopen("cowjog.out","w",stdout); scanf("%d%d",&nodecount,&edgecount); for(int i=1;i<=edgecount;i++){ scanf("%d%d%d",&from[i],&to[i],&val[i]); edge(to[i],from[i],val[i]); } scanf("%d%d%d",&s,&t,&k); printf("%d",Astar(s,t,k)); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator