存图
-
邻接矩阵(二维数组):空间O(n2)O(n^2)O(n2) ,一般不用于稀疏图,遍历时先检查是否有边。
-
邻接表
-
vector存边
vector<int> G; void add_edge(int from, int to) { G[from].push_back(to); }
-
如果带权可以用结构体
struct edge { int v,val; }; vector<edge> graph[N]; void add_edge(int from,int to,int value) { graph[from].push_back((edge){to,value}); } //遍历在C++14后可以写作: //for(auto it:graph[i]) //其中it相当于graph[i][j]
-
排序之后可以log复杂度查边
-
-
邻接链表,以链表储存每一个点的所有边,一般用链式前向星写。
struct Edge{ int to,val,nxt; //一般不用存边的起点 }edge[M];//M看数据,未给就是N*N(N为节点数) int head[N]; //初始化为-1 int tot; void add_edge(int u, int v, int w) //添加一条u->v的权为w的边 { ++tot; edge[tot].to = v; edge[tot].val = w; edge[tot].nxt = head[u]; head[u] = tot; } //遍历写作: //for(int i=head[x];~i;i=edge[i].nxt)
无向边存邻接表:每条边的序号iii 为偶数,反边存在i+1i+1i+1,利用位运算iii^111 迅速找到反边