已知一个带权有向图,其存储结构为邻接表结构 ,设计一算法,由键盘输入数据,建立邻接表,并将其输出。 用例说明: 第一行输入图的顶点数; 第二行输入顶点信息; 第三行以后,按照顺序,每个顶点对应一行,按行输入该顶点对应边的信息(位置 1 权值 1 位置 2 权值 2 ……. ,以 -1 结束)。 输出格式中,代表链表节点的信息是:(边)权值,参见下面用例。
时间: 2023-11-09 18:08:30 浏览: 85
以下是建立邻接表的算法实现(使用C++):
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 邻接表节点定义
struct AdjListNode
{
int dest; // 目标顶点
int weight; // 边权值
AdjListNode* next; // 指向下一个邻接表节点的指针
};
// 邻接表头结点定义
struct AdjListHead
{
int vertex; // 顶点编号
AdjListNode* head; // 指向邻接表第一个节点的指针
};
// 图定义
class Graph
{
private:
int V; // 顶点数
vector<AdjListHead> adjList; // 邻接表
public:
Graph(int V) : V(V)
{
adjList.resize(V); // 初始化邻接表大小
for (int i = 0; i < V; i++)
{
adjList[i].vertex = i; // 设置每个头结点的顶点编号
adjList[i].head = NULL; // 初始化每个头结点的邻接表为空
}
}
// 向图中添加一条边
void addEdge(int src, int dest, int weight)
{
AdjListNode* newNode = new AdjListNode;
newNode->dest = dest;
newNode->weight = weight;
newNode->next = adjList[src].head;
adjList[src].head = newNode;
}
// 输入邻接表
void inputAdjList()
{
cout << "请输入每个顶点对应的边信息(顺序为0 ~ V-1):" << endl;
for (int i = 0; i < V; i++)
{
cout << "第" << i << "个顶点的边信息:";
int dest, weight;
while (cin >> dest && dest != -1)
{
cin >> weight;
addEdge(i, dest, weight);
}
}
}
// 输出邻接表
void outputAdjList()
{
cout << "邻接表:" << endl;
for (int i = 0; i < V; i++)
{
cout << "顶点" << adjList[i].vertex << ": ";
AdjListNode* nodePtr = adjList[i].head;
while (nodePtr)
{
cout << "(" << nodePtr->dest << ")" << nodePtr->weight << " ";
nodePtr = nodePtr->next;
}
cout << endl;
}
}
};
int main()
{
int V;
cout << "请输入图的顶点数:";
cin >> V;
Graph g(V);
g.inputAdjList();
g.outputAdjList();
return 0;
}
```
算法流程:
1. 初始化邻接表大小,每个头结点的顶点编号和邻接表为空。
2. 对于输入的每条边,创建一个邻接表节点,设置目标顶点、边权值和指向下一个节点的指针,然后将该节点插入到源顶点的邻接表中。
3. 输出邻接表,对于每个头结点,遍历其邻接表,输出每个邻接表节点的目标顶点和边权值。
使用示例:
```
请输入图的顶点数:3
请输入每个顶点对应的边信息(顺序为0 ~ V-1):
第0个顶点的边信息:1 2 2 -1
第1个顶点的边信息:2 3 1 -1
第2个顶点的边信息:-1
邻接表:
顶点0: (1)2
顶点1: (2)3 (0)2
顶点2:
```
阅读全文