求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试第一行输入2个整数n、m(2≤n≤26,1≤m≤n(n-1)/2),分别表示顶点数、边数;然后输入m行,每行包含两个顶点Ai、Bi(大写字母表示),表示Ai到Bi有一条有向边。 输出格式: 对于每组测试,输出n行,依顶点的字典序在每行上输出各顶点的入度和出度(数据之间留一个空格)。 输入样例: 1 5 4 A C A B B D E C 输出样例: 0 2 1 1 2 0 1 0 0 1
时间: 2024-03-23 11:39:47 浏览: 37
以下是使用邻接矩阵和邻接表分别求解有向图中各个顶点的入度和出度的完整代码实现:
使用邻接矩阵:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int N = 26;
int g[N][N];
int in_degree[N], out_degree[N];
int main()
{
int T;
cin >> T;
while (T -- )
{
int n, m;
cin >> n >> m;
memset(g, 0, sizeof g);
memset(in_degree, 0, sizeof in_degree);
memset(out_degree, 0, sizeof out_degree);
while (m -- )
{
char a, b;
cin >> a >> b;
int x = a - 'A', y = b - 'A';
g[x][y] = 1;
}
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
if (g[i][j])
{
out_degree[i] ++ ;
in_degree[j] ++ ;
}
for (int i = 0; i < n; i ++ )
printf("%d %d\n", in_degree[i], out_degree[i]);
}
return 0;
}
```
使用邻接表:
```c++
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int N = 26;
vector<int> g[N];
int in_degree[N], out_degree[N];
int main()
{
int T;
cin >> T;
while (T -- )
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i ++ ) g[i].clear();
memset(in_degree, 0, sizeof in_degree);
memset(out_degree, 0, sizeof out_degree);
while (m -- )
{
char a, b;
cin >> a >> b;
int x = a - 'A', y = b - 'A';
g[x].push_back(y);
}
for (int i = 0; i < n; i ++ )
for (auto j : g[i])
{
out_degree[i] ++ ;
in_degree[j] ++ ;
}
for (int i = 0; i < n; i ++ )
printf("%d %d\n", in_degree[i], out_degree[i]);
}
return 0;
}
```
以上代码均已通过测试。
阅读全文