bfs優化

層次單調性node

走地圖函數

雙重bfsspa

1.模塊性code

2.方案:外層bfs逆推,內層bfs從新跑blog

 

A.每次代價0/1:雙端隊列bfs隊列

B.每次代價任意數值:優先隊列bfs(dijikstra)、迭代(SPFA)get

 

UVA11367 Full Tank?it

https://www.luogu.org/problemnew/show/UVA11367io

 1 const int N=1010,M=10010,C=105,INF=99999999;  2 struct node  3 {  4   int u,cc,co;  5   node(int U,int CC,int CO){u=U;cc=CC;co=CO;}  6 };  7 bool operator < (node x,node y){return x.co>y.co;}  8 int f[N][C];  9 int pr[N],u[M<<1],v[M<<1],w[M<<1],fir[N],nxt[M<<1]; 10 int n,m,tot,c,s,e; 11 priority_queue<node> q; 12 
13 void bfs() 14 { 15   while(!q.empty()) q.pop(); 16   q.push(node(s,0,0)); 17   f[s][0]=0; 18   while(!q.empty()) 19  { 20       node p=q.top();q.pop(); 21       //cout<<p.u<<" "<<p.cc<<" "<<p.co<<endl;
22       if(p.u==e) {cout<<p.co<<endl;return;} 23       if(p.cc<c && p.co+pr[p.u]<f[p.u][p.cc+1]) 24  { 25       f[p.u][p.cc+1]=p.co+pr[p.u]; 26       q.push(node(p.u,p.cc+1,p.co+pr[p.u])); 27  } 28  qxx(i,p.u) 29  { 30       if(p.cc>=w[i] && f[v[i]][p.cc-w[i]]>=p.co) 31  { 32           f[v[i]][p.cc-w[i]]=p.co; 33           q.push(node(v[i],p.cc-w[i],p.co)); 34  } 35  } 36  } 37   cout<<"impossible"<<endl; 38 } 39 
40 int main() 41 { 42   n=rd(),m=rd(); 43   FOR(i,1,n) pr[i]=rd(); 44   while(tot<(m<<1)) 45  { 46       u[++tot]=rd(),v[tot]=rd(),w[tot]=rd(); 47       ++u[tot],++v[tot]; 48       nxt[tot]=fir[u[tot]],fir[u[tot]]=tot; 49       ++tot;u[tot]=v[tot-1],v[tot]=u[tot-1],w[tot]=w[tot-1]; 50       nxt[tot]=fir[u[tot]],fir[u[tot]]=tot; 51  } 52   int qq=rd(); 53   FOR(i,1,qq) 54  { 55       memset(f,8,sizeof(f)); 56       c=rd(),s=rd(),e=rd(); 57       ++s,++e; 58  bfs(); 59  } 60   return 0; 61 }

 

 

 

A*class

帶估價函數的bfs

必定有f[i]<=g[i]

越接近效率越高

 

康託展開

排列->序數

∑(i=1->n) i後面比i小的數 * (n-i)!

相關文章
相關標籤/搜索