图的存储与遍历

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值