#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 1024 //最大顶点数
int matrix[maxn][maxn]; //邻接矩阵
int n,m; //顶点数,边数
//边结点
struct ArcNode{
int adjvex; //该边所指向的顶点的位置
int lowcost; //权值
ArcNode* next; //指向的下一条边的指针
};
ArcNode* ArcList[maxn*(maxn-1)]; //所有边结点
int in = 0; //下标
//顶点
struct{
ArcNode* firstarc;
}AdjList[maxn];
//增加一条从i指向j的权值为k的顶点
void add(int i,int j,int k){
matrix[i][j] = k;
ArcNode* p = new ArcNode();
p->adjvex = j;
p->lowcost = k;
p->next = AdjList[i].firstarc;
AdjList[i].firstarc = p;
ArcList[in++] = p;
}
void destoryArc(){//销毁邻接表
for(int i = 0;i<in;++i){
delete ArcList[i]; //删除
ArcList[i] = 0; //指针置空
}
for(int i = 0;i<n;++i){
AdjList[i].firstarc = 0;
}
}
bool tag[maxn]; //访问标记
//深度优先遍历序列,v : 当前访问的顶点
void dfs1(int v = 0){
cout << v << " ";
tag[v] = 1; //给这个顶点加入标记
ArcNode* p = AdjList[v].firstarc; //邻接表
while(p){
if(!tag[p->adjvex])
dfs1(p->adjvex);
p = p->next;
}
p = 0;
}
int que[maxn]; //队列
int qi = 0,qj = 0; //头指针和尾指针
//广度优先
void bfs(){
memset(tag,0,sizeof(tag)); //清空访问标记
int v = 0;
qi = 0;
qj = 0;
tag[v] = 1;
cout << "bfs:";
que[qj++] = v;
ArcNode*p = 0;
while(qi != qj){//只要队列不空,就一直循环
v = que[qi++];
cout << v << " ";
qi %= maxn; //如果qi >= maxn,则从0开始
p = AdjList[v].firstarc;
while(p){
if(!tag[p->adjvex]){//只要没被访问过就入栈
que[qj++] = p->adjvex;
qj %= maxn;
tag[p->adjvex] = 1;
}
p = p->next; //指针后移
}
p = 0;
}
cout << endl;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
n = 6;
m = 10;//初始化邻接矩阵
for(int i = 0;i<n;++i){
for(int j = 0;j<n;++j){
matrix[i][j] = -1;
}
}
//增加m条边
add(0,1,5);
add(0,3,3);
add(1,2,4);
add(2,0,8);
add(2,5,9);
add(3,2,5);
add(3,5,6);
add(4,3,5);
add(5,4,1);
add(5,0,3);
cout << "邻接矩阵:" << endl;
for(int i = 0;i<n;++i){
for(int j = 0;j<n;++j){
cout << matrix[i][j] << " \n"[j == n-1];
}
}
memset(tag,0,sizeof(tag)); //清空访问标记
cout << "深度优先:";
dfs1();
cout << endl;
memset(tag,0,sizeof(tag)); //清空访问标记
cout << "广度优先";
bfs();
destoryArc(); //销毁邻接表
return 0;
}
12-10
12-09
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交