构造有向(无向)加权图

邻接表的一般构造

#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边录入,此时con
4;

输入: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++//更新顶点信息为顶点连接第四条边

第五条边同上。
在这里插入图片描述
完成数据录入后,数据储存如上图所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值