若有向图采用邻接表作为存储结构,试给出计算图中各顶点的入度的算法
时间: 2023-09-12 10:05:18 浏览: 164
5个顶点图的入度和出度
### 回答1:
计算有向图中各顶点的入度的算法如下:
1. 初始化一个大小为n的数组indegree,其中n为图中顶点的数量,将每个元素初始化为0。
2. 遍历邻接表,对于每个顶点,遍历其所对应的边,将该边的终点顶点的入度加1。
3. 返回indegree数组,该数组中第i个元素即表示第i个顶点的入度。
以下是该算法的具体实现,假设邻接表采用链式前向星存储:
```C++
const int N = 100010;
int head[N], ver[N], nxt[N], idx; // 链式前向星存储图
int indegree[N]; // 存储每个顶点的入度
void add(int a, int b) {
ver[++idx] = b;
nxt[idx] = head[a];
head[a] = idx;
}
void get_indegree(int n) {
for (int i = 1; i <= n; i++) {
for (int j = head[i]; j; j = nxt[j]) {
indegree[ver[j]]++;
}
}
}
```
其中,add函数用于向链式前向星中添加一条从a到b的边,get_indegree函数用于计算各顶点的入度。
### 回答2:
若有向图采用邻接表作为存储结构,我们可以通过遍历邻接表来计算每个顶点的入度。
算法步骤如下:
1. 创建一个长度为顶点数的数组indegree,用于记录每个顶点的入度。
2. 遍历图中每个顶点的邻接表。
3. 对于每个邻接表中的节点,将其对应的顶点的入度加一。即indegree[v] += 1,其中v为当前节点的值。
4. 遍历所有顶点,输出每个顶点的入度。
该算法的时间复杂度为O(V + E),其中V为顶点数,E为边数。通过遍历每个节点的邻接表,我们可以快速计算出每个顶点的入度。
例如,对于以下有向图的邻接表表示:
1->2->3->5
2->4
3->5
4->3
5
根据算法步骤:
1. 创建长度为5的数组indegree。
2. 遍历每个顶点的邻接表:
- 对于顶点1,它的邻接表为2->3->5,将2、3、5的入度分别加一:indegree[2] += 1,indegree[3] += 1,indegree[5] += 1。
- 对于顶点2,它的邻接表为4,将4的入度加一:indegree[4] += 1。
- 对于顶点3,它的邻接表为5,将5的入度加一:indegree[5] += 1。
- 对于顶点4,它的邻接表为3,将3的入度加一:indegree[3] += 1。
- 对于顶点5,它没有邻接表。
3. 输出每个顶点的入度:indegree[1]为0,indegree[2]为1,indegree[3]为2,indegree[4]为1,indegree[5]为2。
阅读全文