邻接表的一般构造
#include<bits/stdc++.h>
#define N 1e4
using namespace std;
typedef struct BP{
int P;//边所指的顶点位置
struct BP *nextB;//指向下一条边的指针
int Q;//储存边的信息
}BP;
typedef struct DP{
int date;//顶点信息
BP *FirstB;//指向第一条连接该点的边
}DP,lin[N];//构建邻接表类型lin;
int main()
{
return 0;
}
以上步骤些许繁杂,利用STL构建邻接表就方便多了
以下是一vector构建的邻接表
#include<bits/stdc++.h>
#define N 1e4
using namespace std;
typedef struct Node{//构建储存节点信息模块
int Pin;//定点编号
int Quan;//边权值
}Node;
vector<Node>lin[N];
int main()
{
//操作方式:
//顶点u,连接点v,边权值w
int u,v,w;
cin>>u>>v>>w;
Node P;//创建新节点
P.Pin=v,P.Quan=w;
lin[u].push_back(P);
return 0;
}
链式前向星
适合于存储稀疏图,它可以有效地存储图的边和节点信息,以及边的权重
存储的数据结构:
#define N 1e4
typedef struct t{
int to;//边的终点
int w;//边的权值
int next;//指向同一起点的上一条边
}t[N];
int last[N];//邻接表头节点数组
int con=1;//记录第几条边
实现过程
int u,v,w;//u顶点,v被指向点,w边权
cin>>u>>v>>w;
//实现函数
void add(int u,int v,int w)
{
t[con].to=v;
t[con].w=w;
t[con].next=last[con];//采用头插法,新插入的点记录顶点的下一个点
last[u]=con++;//更新顶点连接的第一个点
}
以下图为例
过程演示
初始
last[1]=-1
last[2]=-1
last[3]=-1
last[4]=-1
刚开始没录入连接关系,各点未连接其它点,赋值为-1
cin>>u>>v>>w;
首先输入:1 2 1 //1指向2权值为1;con==1;
last[u]=-1 (last[1]=-1)
t[1].to=2//该边指向点2
t[1].w=1//该边权值为1
t[1].next=last[1]//采用头插法,将该边指向顶点连接的第一条边,由于第一个点还未连接,所以不指向任何点,值仍为-1
(这里是以边指向边来记录的)
last[u]=con++ (last[1]==1 );//更新顶点连接的第一条边,con自增,准备录入第2条边
第二条边和第三条边同样如此
假设第2和3边录入,此时con4;
输入:1 3 4//1指向3,边权为4
last[u]=-1 (last[1]=1)//刚才顶点1已连接第一条边,所以等于1;
t[4].to=3//该边指向3
t[4].w=4//该边权值为4
t[4].next=last[u]==1//刚才顶点已连接第一条边,所以,第四条边连接第一条边
last[1]=con++//更新顶点信息为顶点连接第四条边
第五条边同上。
完成数据录入后,数据储存如上图所示