边的表示问题:
图的表示一般有两种:邻接表和邻接矩阵表示,邻接表表示法的空间开销比较小,但对于点少边多的情况则不太适用。其空间复杂度为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