1.键盘输入数据,建立一个有向图的邻接表。 2.输出该邻接表。 3.在有向图的邻接表的基础上计算各顶点的度,并输出。 4.以有向图的邻接表为基础实现输出它的拓扑排序序列。 5.采用邻接矩阵存储一个有
时间: 2024-03-21 10:41:22 浏览: 73
建立和输出有向图的邻接表的问题
4星 · 用户满意度95%
向图,实现深度优先遍历和广度优先遍历,并输出遍历序列。
1. 建立有向图的邻接表需要输入每个顶点以及它所能到达的顶点,可以使用键盘输入数据的方式来建立。具体实现方法可以参考以下伪代码:
```
// 输入顶点个数和边数
int n, m;
cin >> n >> m;
// 定义邻接表
vector<int> adj[n + 1];
// 输入每条边的信息
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
}
```
2. 输出邻接表可以使用以下伪代码:
```
// 输出邻接表
for (int u = 1; u <= n; u++) {
cout << u << ": ";
for (int v : adj[u]) {
cout << v << " ";
}
cout << endl;
}
```
3. 计算各顶点的度可以使用以下伪代码:
```
// 定义度数数组
int degree[n + 1];
// 初始化度数数组
memset(degree, 0, sizeof(degree));
// 计算每个顶点的入度和出度
for (int u = 1; u <= n; u++) {
for (int v : adj[u]) {
degree[u]++;
degree[v]--;
}
}
// 输出各顶点的度数
for (int u = 1; u <= n; u++) {
cout << "degree[" << u << "] = " << degree[u] << endl;
}
```
4. 输出有向图的拓扑排序序列可以使用以下伪代码:
```
// 定义拓扑排序序列
vector<int> topo;
// 定义入度数组
int indegree[n + 1];
// 初始化入度数组
memset(indegree, 0, sizeof(indegree));
for (int u = 1; u <= n; u++) {
for (int v : adj[u]) {
indegree[v]++;
}
}
// 将入度为0的顶点加入队列
queue<int> q;
for (int u = 1; u <= n; u++) {
if (indegree[u] == 0) {
q.push(u);
}
}
// 循环遍历队列
while (!q.empty()) {
int u = q.front();
q.pop();
topo.push_back(u);
for (int v : adj[u]) {
indegree[v]--;
if (indegree[v] == 0) {
q.push(v);
}
}
}
// 输出拓扑排序序列
for (int u : topo) {
cout << u << " ";
}
cout << endl;
```
5. 采用邻接矩阵存储一个有向图,可以使用以下伪代码:
```
// 输入顶点个数和边数
int n, m;
cin >> n >> m;
// 定义邻接矩阵
int adj[n + 1][n + 1];
// 初始化邻接矩阵
memset(adj, 0, sizeof(adj));
// 输入每条边的信息
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u][v] = 1;
}
// 深度优先遍历
void dfs(int u, bool visited[]) {
visited[u] = true;
cout << u << " ";
for (int v = 1; v <= n; v++) {
if (adj[u][v] == 1 && !visited[v]) {
dfs(v, visited);
}
}
}
// 广度优先遍历
void bfs(int u, bool visited[]) {
queue<int> q;
q.push(u);
visited[u] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int v = 1; v <= n; v++) {
if (adj[u][v] == 1 && !visited[v]) {
q.push(v);
visited[v] = true;
}
}
}
}
// 输出深度优先遍历序列
bool visited[n + 1];
memset(visited, false, sizeof(visited));
for (int u = 1; u <= n; u++) {
if (!visited[u]) {
dfs(u, visited);
}
}
cout << endl;
// 输出广度优先遍历序列
memset(visited, false, sizeof(visited));
for (int u = 1; u <= n; u++) {
if (!visited[u]) {
bfs(u, visited);
}
}
cout << endl;
```
阅读全文