【算法总结】图论-预备知识

【算法总结】图论-预备知识

邻接矩阵:用一个二维数组来表示图的相关信息,如edge[i][j]表示结点i和结点j之间的关系(以及权重)——在表示的图为稠密图,且频繁地判断特定结点对是否相邻时,使用邻接矩阵较为适宜

邻接链表:链式存储结构,为图的每个顶点建立一个单链表,第i个单链表中保存与结点相邻的所有结点(无向图)或所有以结点Vi为弧尾的弧指向的结点(有向图)及其有关信息——当应用中存在大量遍历邻接结点的操作而较少判断两个特定结点关系时,选用邻接链表较为适宜

邻接链表的数据结构表示:vector

1.定义一个结构体,包括邻接结点和边权值,用来表示一条边。

struct Edge
{
    int nextNode;//下一个结点编号
    int cost;//该边的权重
};

2.为每一个结点建立一个单链表来保存与其相邻的边权值和结点的信息。建立一个大小为N的数组,保存元素即为vector对象,edge[i]表示为结点i建立的单链表。

vector<Edge> edge[N];

3.单链表初始化,利用vector::clear()操作清空这些单链表

for (int i = 0; i < N; i++)//遍历所有结点
{
    edge[i].clear();//清空其单链表
}

4.向图中加入边,即添加一个Edge对象到对应结点的链表中。

Edge tmp;//准备一个Edge结构体
tmp.nextNode = 3;//下一结点的编号为3
tmp.cost = 38;//该边权值为38
edge[1].push_back(tmp);//将改变加入结点1的单链表中

5.查询某个结点的所有邻接信息,则对vector进行遍历

for (int i = 0; i < edge[2].size; i++)//对edge[2]遍历,即对所有和结点2相邻的边进行遍历
{
    int nextNode = edge[2][i].nextNode;//读出邻接结点
    int cost = edge[2][i].cost;//读出该边权值
}

6.删除单链表的某些边的信息时,调用vector::erase,即 vector.erase(vector.begin() + 第一个要删除的元素编号,vector.begin() + 最后一个要删除元素的编号 + 1,比如删除结点1的单链表edge[1][i]所对应的边的信息时,

edge[1].erase(edge[1].begin() + i, edge[1].begin() + 1 + 1);

猜你喜欢

转载自www.cnblogs.com/yun-an/p/11085019.html