优先队列优化 dijkstra

来源:互联网 发布:win7 dhcp服务器软件 编辑:程序博客网 时间:2024/04/23 18:07
#define inf INT_MAXint len,n,m,c;bool vis[N];int pre[N];struct node{int y,w,pre;//pre是为了符合上面的数组,在队列中没有什么价值的node(){};node(int _y,int _w,int _p):y(_y),w(_w),pre(_p){}bool operator <(const node a)const{return w>a.w;//实际上w是按照升序排列的}};int dp[N];node a[N*2];priority_queue<node>q; void init(){    len=0; memset(pre,-1,sizeof(pre));}void addpage(int x,int y,int w){//cout<<x<<" "<<y<<" "<<w<<endl;a[len].y=y;a[len].w=w;a[len].pre=pre[x];pre[x]=len++;}int spfa(){     memset(vis,false,sizeof(vis)); repf(i,1,3*n) dp[i]=inf; dp[1]=0; q.push(node(1,0,0)); while(!q.empty()) { node r=q.top(); q.pop(); int x=r.y; if(vis[x]==true) continue; vis[x]=true; for(int i=pre[x]; i!=-1; i=a[i].pre) { int y=a[i].y;  if(vis[y]==false && dp[y]>dp[x]+a[i].w) dp[y]=dp[x]+a[i].w, q.push(node(y,dp[y],0)); } } if(dp[n]==inf) return -1; else return dp[n];}