数据结构 PTA 7-1 上机作业5 7-1 图的邻接矩阵存储和遍历

7-1 图的邻接矩阵存储和遍历

分数 100

全屏浏览题目

切换布局

作者 upcdsa

单位 中国石油大学(华东)

图的邻接矩阵存储用一个一维数组存储各顶点数据元素,一个二维数组存储顶点之间的邻接关系。
 

image.png


如上面的无向加权图,顶点数据元素为“A-Z”之间的单个字符,为了使遍历输出结果唯一,要求顶点数据元素按由小到大(ASCII码)的顺序存储。例如,对于上面的加权图,数据元素按照B、C、D、F、H、L、W、X、Y、Z的顺序存储。依附于边的权值为整数,且大于0。使用C或C++编写算法,实现:
(1)使用邻接矩阵存储结构,按照输入数据建立加权图;
(2)按存储位置,从第1个顶点出发,按照深度优先搜索算法输出各顶点数据;
(3)按存储位置,从第1个顶点出发,按照广度优先搜索算法输出各顶点数据;
(4)按存储位置,计算并输出个顶点的度。

输入格式:

输入分为以下几行,第1行为图的顶点数,第2行为图的边数,第3行及以后各行为图的各个边依附的顶点及其权值。

输出格式:

输出分为以下行,第1行为深度优先遍历序列,第2行为广度优先遍历序列,其后为各顶点及其度。

输入样例:

如上图的输入格式为:

10
17
Z B 8
Z W 5
B D 5
B W 5
B L 4
D L 4
W X 8
W H 4
L H 4
L F 2
X H 7
X Y 5
H F 3
H Y 5
H C 6
F C 7
C Y 6

输出样例:

如上图的输出为:

DFS: B D L F C H W X Y Z
BFS: B D L W Z F H X C Y
B:4
C:3
D:2
F:3
H:6
L:4
W:4
X:3
Y:3
Z:2

其中"DFS:","BFS:","B:","C:"等为提示标志,序列" B D L F C H W X Y Z"的每个字符前面有一个空格。

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <bits/stdc++.h>

using namespace std;
vector<int>s[35];
bool st[65];
void Dfs(int u)
{
    for(int i = 0;i<s[u].size();i++)
    {
        int j = s[u][i];
        if(st[j] == 0)
        {
            st[j]=1;
            cout << " " << char(j+'A');
            Dfs(j);
        }
    }
}
void Bfs(int u)
{
    queue<int>q;
    q.push(u);
    st[u]=1;
    while(q.size())
    {
        int t = q.front();
        q.pop();
        for(int i = 0;i<s[t].size();i++)
        {
            int j = s[t][i];
            if(st[j]==0)
            {
                st[j]=1;
                cout << " " << char(j+'A');
                q.push(j);
            }
        }
    }
}
int main()
{
    int n,m;
    cin >> n >> m;
    while(m--)
    {
        char a,b;
        cin >> a >> b;
        int w;
        cin >> w;
        s[a-'A'].push_back(b-'A');
        s[b-'A'].push_back(a-'A');
    }
    int f = -1;
    for(int i = 0;i<=26;i++)
    {
        if(s[i].size()>0&&f==-1)f = i;
        sort(s[i].begin(),s[i].end());
    }
    cout << "DFS: " << char(f+'A');
    st[f]=1;
    Dfs(f);
    memset(st,0,sizeof st);
    cout << endl;
    cout << "BFS: " << char(f+'A');
    Bfs(f);
    cout <<endl;
    for(int i = 0;i<=26;i++)
    {
        if(s[i].size()>0)
        {
            cout << char(i+'A') << ":" << s[i].size() << endl;
        }
    }
    return 0;
}

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云边牧风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值