dijkstra算法(二):邻接表表示法

边的表示问题:

图的表示一般有两种:邻接表和邻接矩阵表示,邻接表表示法的空间开销比较小,但对于点少边多的情况则不太适用。其空间复杂度为O(n+e)。如果e达到n2数量接的时候,,邻接矩阵则比较适合。空间复杂度只取决于顶点的数量n。空间复杂度为O(n2)。

邻接表的实现思路:

可以构造一个结构体,成员为每一条边的终点v和权重w。然后开一个结构体数组edge[maxn]。用head[u](u为顶点)数组来指向每一组起点相同的边的链表。

dijkstra算法(双向):

#include<iostream>
#include<queue>
#define INF 0x3f3f3f

using namespace std;
const int maxn = 200005;  //边的数目较多
int head[10005];
int dis[10005];
bool vis[10005];
int cnt = 0;

struct qnode
{
   
	int u;  //起点
	int w;  //边的长度(权重)
	qnode(int u,int w):u(u),w(w){
   }
	bool operator < (const qnode b) const
	{
   
		return w > b.w;
	}
};

struct Edge
{
   
	int v;    //边的终点
	int w;
	int mext;    //指向下一条边
}edge[maxn];

void add_edge(int u,int v,int w)
{
   
	edge[cnt].v = v;
	edge[cnt].w = w;
	edge[cnt].mext = head[u];
	head[u] = cnt;
	cnt++;
}
priority_queue<qnode> p;

void dijkstra(int s)
{
   
	int u, v, w;
	int i;
	while (!p.empty())
		p.pop();
	p.push
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值