用c语言编写代码:求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试第一行输入2个整数n、m(2≤n≤26,1≤m≤n(n-1)/2),分别表示顶点数、边数;然后输入m行,每行包含两个顶点Ai、Bi(大写字母表示),表示Ai到Bi有一条有向边。 输出格式: 对于每组测试,输出n行,依顶点的字典序在每行上输出各顶点的入度和出度(数据之间留一个空格)。
时间: 2024-03-24 07:36:02 浏览: 154
好的,以下是C语言代码实现,分别采用邻接矩阵和邻接表两种不同的存储结构完成:
邻接矩阵实现:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 26
int n, m;
int inDegree[MAXN], outDegree[MAXN];
int matrix[MAXN][MAXN];
void init() {
memset(matrix, 0, sizeof(matrix));
memset(inDegree, 0, sizeof(inDegree));
memset(outDegree, 0, sizeof(outDegree));
}
void solve() {
scanf("%d%d", &n, &m);
init();
for (int i = 1; i <= m; i++) {
char a, b;
scanf(" %c %c", &a, &b);
int x = a - 'A', y = b - 'A';
if (matrix[x][y] == 0) {
matrix[x][y] = 1;
outDegree[x]++;
inDegree[y]++;
}
}
for (int i = 0; i < n; i++) {
printf("%c %d %d\n", i + 'A', inDegree[i], outDegree[i]);
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
```
邻接表实现:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 26
#define MAXM MAXN*(MAXN-1)/2
int n, m;
int inDegree[MAXN], outDegree[MAXN];
typedef struct Node {
int to;
int next;
} Node;
Node edge[MAXM];
int head[MAXN], cnt;
void init() {
memset(head, -1, sizeof(head));
memset(inDegree, 0, sizeof(inDegree));
memset(outDegree, 0, sizeof(outDegree));
cnt = 0;
}
void addEdge(int u, int v) {
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void solve() {
scanf("%d%d", &n, &m);
init();
for (int i = 1; i <= m; i++) {
char a, b;
scanf(" %c %c", &a, &b);
int x = a - 'A', y = b - 'A';
int flag = 1;
for (int j = head[x]; j != -1; j = edge[j].next) {
if (edge[j].to == y) {
flag = 0;
break;
}
}
if (flag) {
addEdge(x, y);
outDegree[x]++;
inDegree[y]++;
}
}
for (int i = 0; i < n; i++) {
printf("%c %d %d\n", i + 'A', inDegree[i], outDegree[i]);
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
```
阅读全文