图综合练习–构建邻接表
题目描述
已知一有向图,构建该图对应的邻接表。
邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连的顶点信息。
单链表的每个结点也包含两个属性,属性一是顶点在数组的位置下标,属性二是指针域next指向下一个结点。
输入
第1行输入整数t,表示有t个图
第2行输入n和k,表示该图有n个顶点和k条弧。
第3行输入n个顶点。
第4行起输入k条弧的起点和终点,连续输入k行
以此类推输入下一个图
输出
输出每个图的邻接表,每行输出格式:数组下标 顶点编号-连接顶点下标-…-^,数组下标从0开始。
具体格式请参考样例数据,每行最后加入“^”表示NULL。
输入样例:
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D
输出样例:
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
参考代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
struct Vertex {
char info{};
list<int> adiList;
};
void buildAdjacencyList(int n, int k, vector<char> &vertices, vector<pair<char, char>> &edges) {
vector<Vertex> adjacencyList(n);
for (int i = 0; i < n; ++i) {
adjacencyList[i].info = vertices[i];
}
for (int i = 0; i < k; ++i) {
char start = edges[i].first;
char end = edges[i].second;
if (isalpha(vertices[0]))
adjacencyList[start - 'A'].adiList.push_back(end - 'A');
else
adjacencyList[start - '0'].adiList.push_back(end - '0');
}
for (int i = 0; i < n; ++i) {
cout << i << ' ' << adjacencyList[i].info << '-';
for (int neighbor: adjacencyList[i].adiList)
cout << neighbor << '-';
cout << '^' << endl;
}
}
int main() {
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
vector<char> vertices(n);
for (int i = 0; i < n; ++i) {
cin >> vertices[i];
}
vector<pair<char, char>> edges(k);
for (int i = 0; i < k; ++i) {
cin >> edges[i].first >> edges[i].second;
}
buildAdjacencyList(n, k, vertices, edges);
}
return 0;
}