概述
算法导论上面的伪代码实现哦,没啥技术,不过这个邻接表表示法(figo大神教的)很nice。
简单说一下,head里面是放着自己节点后面链的最后一个元素在边池中的位置,边池里面成一个一个链状,像并查集,但是没有路径压缩,边池为next通过for(int i=head[v];i!=-1;i=next[i])就能找到属于v节点的所以边,对应next下标里面存放着,dest[i]为和v构成边的节点,dist里面存放着距离,这里是没有边权的图,所以默认为1,主要看代码,给力。
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<string>
#include<bitset>
#include<queue>
#include<vector>
#include<string>
#include<cmath>
#include<map>
#define rep(i,n,m) for(int i=(n);i<=(m);++i)
#define re1(i,n) rep(i,1,n)
#define re0(i,n) rep(i,0,n)
#define RE(a) ((a)*(a))
#define SIZE(a) (int((a).size()))
#define vi vector<int>
#define vl vector<ll>
#define vs vector<string>
#define qi queue<int>
#define ql queue<ll>
#define qs queue<string>
//count distance 不能用哦,已经定义了。
using namespace std;
typedef long long ll;
template<class T>
void inline maxi(T a,T b){
a=max(a,b);
}
template<class T>
void inline mini(T a,T b){
a=min(a,b);
}
template<class T>
void show(T &a,int n,int m){
rep(i,n,m){
cout<<setw(6)<<a[i];
}
cout<<endl;
}
template<class T>
void show(T *a[10],int n,int m){
re0(i,n){
re0(j,m)
cout<<a[i]<<' ';
cout<<endl;
}
}
const int maxnum=8+1;
const int maxint=2147483647;
//graph
int head[maxnum];
vi next,dist,dest;
void add_direct(int from,int to,int dis=1){
next.push_back(head[from]);
head[from]=SIZE(next)-1;
dist.push_back(dis);
dest.push_back(to);
}
void add_nodirect(int from,int to,int dis=1){
add_direct(from,to,dis);
add_direct(to,from,dis);
}
void init(){
next.clear();
dist.clear();
dest.clear();
re0(u,maxnum-1)
head[u]=-1;
add_nodirect(1,3);
add_nodirect(1,2);
add_nodirect(4,3);
add_nodirect(4,5);
add_nodirect(4,6);
add_nodirect(5,6);
add_nodirect(5,7);
add_nodirect(6,7);
add_nodirect(6,8);
add_nodirect(8,7);
// show(head,1,8);
// show(next,0,SIZE(next)-1);
// show(dest,0,SIZE(next)-1);
}
int path[maxnum];
void bfs(int s){
qi Q;
bool vis[maxnum];
re0(u,maxnum-1){
vis[u]=false;
path[u]=-1;
}
vis[s]=true;
Q.push(s);
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=head[u];i!=-1;i=next[i]){
int v = dest[i];
if(vis[v])
continue;
Q.push(v);
vis[v]=1;
path[v]=u;
}
}
}
void print_path(int from,int to){
if(to==from){
cout<<from<<endl;
}else if(path[to]==-1){
cout<<"no way"<<endl;
}else{
print_path(from,path[to]);
cout<<to<<endl;
}
}
//#define codeforces CODEFORCES
int main(){
#ifdef codeforces
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
init();
bfs(3);
print_path(4,7);
}
转载于:https://www.cnblogs.com/gggin/archive/2012/12/25/2832436.html
最后
以上就是健康摩托为你收集整理的[邻接表] 学习邻接表的表示方法+BFS的全部内容,希望文章能够帮你解决[邻接表] 学习邻接表的表示方法+BFS所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复