求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试第一行输入2个整数n、m(2≤n≤26,1≤m≤n(n-1)/2),分别表示顶点数、边数;然后输入m行,每行包含两个顶点Ai、Bi(大写字母表示),表示Ai到Bi有一条有向边。 输出格式: 对于每组测试,输出n行,依顶点的字典序在每行上输出各顶点的入度和出度(数据之间留一个空格)。用c语言写
时间: 2023-12-06 11:39:44 浏览: 33
邻接矩阵存储:
```c
#include <stdio.h>
#include <string.h>
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n, m;
scanf("%d%d", &n, &m);
int indegrees[n], outdegrees[n];
memset(indegrees, 0, sizeof(indegrees));
memset(outdegrees, 0, sizeof(outdegrees));
int matrix[n][n];
memset(matrix, 0, sizeof(matrix));
for (int i = 0; i < m; i++)
{
char u, v;
scanf(" %c %c", &u, &v);
int x = u - 'A', y = v - 'A';
matrix[x][y] = 1;
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j])
{
outdegrees[i]++;
indegrees[j]++;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%c %d %d\n", 'A' + i, indegrees[i], outdegrees[i]);
}
}
return 0;
}
```
邻接表存储:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
int val;
struct Node *next;
} Node;
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n, m;
scanf("%d%d", &n, &m);
Node *indegrees[n], *outdegrees[n];
memset(indegrees, 0, sizeof(indegrees));
memset(outdegrees, 0, sizeof(outdegrees));
Node *nodes[n];
memset(nodes, 0, sizeof(nodes));
for (int i = 0; i < n; i++)
{
nodes[i] = (Node *)malloc(sizeof(Node));
nodes[i]->val = i;
nodes[i]->next = NULL;
}
for (int i = 0; i < m; i++)
{
char u, v;
scanf(" %c %c", &u, &v);
int x = u - 'A', y = v - 'A';
Node *node = (Node *)malloc(sizeof(Node));
node->val = y;
node->next = nodes[x]->next;
nodes[x]->next = node;
}
for (int i = 0; i < n; i++)
{
Node *node = nodes[i]->next;
while (node != NULL)
{
int j = node->val;
outdegrees[i]++;
indegrees[j]++;
node = node->next;
}
}
for (int i = 0; i < n; i++)
{
printf("%c %d %d\n", 'A' + i, indegrees[i], outdegrees[i]);
}
}
return 0;
}
```