7-1 图的邻接矩阵存储和遍历
分数 100
全屏浏览题目
切换布局
作者 upcdsa
单位 中国石油大学(华东)
图的邻接矩阵存储用一个一维数组存储各顶点数据元素,一个二维数组存储顶点之间的邻接关系。
如上面的无向加权图,顶点数据元素为“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;
}