1.队列式分支限界法,普通BFS求解图的单源最短路问题
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 51
int n;
int a[MAXN][MAXN];
int v;
int dist[MAXN];
int prev[MAXN];
struct NodeType{
int vno;
int length;
};
void bfs(int v){
NodeType e,e1;
queue<NodeType>pqu;
e.vno=v;
e.length=0;
pqu.push(e);
dist[v]=0;
while(!pqu.empty()){
e=pqu.front();
pqu.pop();
for(int j=0;j<n;j++){
if(a[e.vno][j]<INF&&e.length+a[e.vno][j]<dist[j]){
dist[j]=e.length+a[e.vno][j];
prev[j]=e.vno;
e1.vno=j;
e1.length=dist[j];
pqu.push(e1);
}
}
}
}
void addEdge(int i,int j,int w){
a[i][j]=w;
}
void dispapath(int v,int i){
vector<int>path;
if(v==i) return;
if(dist[i]==INF) {
printf("从原点%d到定点%d没有路径\n",v,i);
}
else {
int k=prev[i];
path.push_back(i);
while(k!=v) {
path.push_back(k);
k=prev[k];
}
path.push_back(v);
printf("从原点%d到定点%d最短路径长度:%d\n",v,i,dist[i]);
for(int j=path.size()-1;j>=0;j--){
printf("%d ",path[j]);
}
printf("\n");
}
}
void dispallpath(int v){
for(int i=0;i<n;i++){
dispapath(v,i);
}
}
int main(){
memset(dist,INF,sizeof(dist));
memset(a,INF,sizeof(a));
n=6;
for(int i=0;i<n;i++){
a[i][i]=0;
}
addEdge(0,2,10);
addEdge(0,4,30);
v=0;
bfs(v);
dispallpath(v);
}
2.优先队列式分支限界法,跳跃式BFS求解图的单源最短路问题
struct NodeType{
int vno;
int length;
bool operator < (const NodeType &node) const {
return length > node.length;
}
};
void bfs(int v){
NodeType e,e1;
priority_queue<NodeType>pqu;
e.vno=v;
e.length=0;
pqu.push(e);
dist[v]=0;
while(!pqu.empty()){
e=pqu.top();
pqu.pop();
for(int j=0;j<n;j++){
if(a[e.vno][j]<INF&&e.length+a[e.vno][j]<dist[j]){
dist[j]=e.length+a[e.vno][j];
prev[j]=e.vno;
e1.vno=j;
e1.length=dist[j];
pqu.push(e1);
}
}
}
}
3.采用普通队列式分支限界法求解0/1背包问题
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#define MAXN 30
int n=3,W=30;
int w[]={0,16,15,15};
int v[]={0,45,25,25};
int maxv=-9999;
int bestx[MAXN];
int total=1;
struct NodeType{
int no,i,w,v;
int x[MAXN];
double ub;
};
void bound(NodeType & e){
int i=e.i+1;
int sumw=e.w;
double sumv=e.v;
while(sumw+w[i]<=W&&i<=n){
sumw+=w[i];
sumv+=v[i];
i++;
}
if(i<=n) e.ub=sumv+(W-sumw)*v[i]/w[i];
else e.ub=sumv;
}
void EnQueue(NodeType e,queue<NodeType> &qu){
if(e.i==n){
if(e.v>maxv){
maxv=e.v;
for(int j=1;j<=n;j++) {
bestx[j]=e.x[j];
}
}
}else qu.push(e);
}
void bfs(){
int j;
NodeType e,e1,e2;
queue<NodeType>qu;
e.i=0;
e.w=0;
e.v=0;
e.no=total++;
for(j=1;j<=n;j++){
e.x[j]=0;
}
bound(e);
qu.push(e);
while(!qu.empty()){
e=qu.front();qu.pop();
if(e.w+w[e.i+1]<=W){
e1.no=total++;
e1.i=e.i+1;
e1.w=e.w+w[e1.i];
e1.v=e.v+v[e1.i];
for(j=1;j<=n;j++) e1.x[j]=e.x[j];
e1.x[e1.i]=1;
bound(e1);
EnQueue(e1,qu);
}
e2.no=total++;
e2.i=e.i+1;
e2.w=e.w;
e2.v=e.v;
for(j=1;j<=n;j++) e2.x[j]=e.x[j];
e2.x[e2.i]=0;
bound(e2);
if(e2.ub>maxv) EnQueue(e2,qu);
}
}
int main(){
bfs();
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
cout<<endl<<maxv<<endl;
}
4.采用优先队列式分支限界法求解0/1背包问题
struct NodeType{
int no,i,w,v;
int x[MAXN];
double ub;
bool operator<(const NodeType &s)const {
return ub<s.ub;
}
};
时间复杂度 2^n,同空间