指针版邻接表

比起数组优点有三:

1.代码量少

2.fch再也不用想着清-1,不用纠结反向弧

3.更好理解了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(‘ ‘)
 8 #define ENT putchar(‘\n‘)
 9 using namespace std;
10 const int maxn=100000+10,maxm=100000+10,inf=-1u>>1;
11 struct BFS{
12     struct ted{int x,y;ted*next;}adj[maxm],*fch[maxn],*ms;
13     bool vis[maxn];int n;
14     void init(int n){
15         this->n=n;ms=adj;memset(vis,false,sizeof(vis));return;
16     }
17     void ade(int u,int v){*ms=(ted){u,v,fch[u]};fch[u]=ms++;return;}
18     void bfs(int x){
19         queue<int>Q;Q.push(x);vis[x]=true;
20         while(!Q.empty()){
21             int u=Q.front();Q.pop();
22             for(ted*e=fch[u];e;e=e->next){
23                 int v=e->y;if(!vis[v]) vis[v]=true,Q.push(v);
24             }
25         } return;
26     }
27 }p1,p2;
28 inline int read(){
29     int x=0,sig=1;char ch=getchar();
30     while(!isdigit(ch)){if(ch==‘-‘)sig=-1;ch=getchar();}
31     while(isdigit(ch))x=10*x+ch-‘0‘,ch=getchar();
32     return x*=sig;
33 }
34 inline void write(int x){
35     if(x==0){putchar(‘0‘);return;}if(x<0)putchar(‘-‘),x=-x;
36     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
37     for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘);return;
38 }
39 int n,m;
40 void init(){
41     n=read();m=read();
42     p1.init(n);p2.init(n);
43     int x,y;
44     for(int i=1;i<=m;i++){
45         x=read();y=read();
46         p1.ade(x,y);
47         p2.ade(y,x);
48     } p1.bfs(1);p2.bfs(1);
49     for(int i=1;i<=n;i++){
50         if(p1.vis[i]&&p2.vis[i]) write(i),ENT;
51     }
52     return;
53 }
54 void work(){
55     return;
56 }
57 void print(){
58     return;
59 }
60 int main(){init();work();print();return 0;}
时间: 2024-07-29 01:15:08

指针版邻接表的相关文章

图的邻接表表示

要完整地表示一个图,就需要明确图中有什么,很简单,节点和边. 所以,在用邻接表表示一个图的时候,我们需要分别表示其节点和边,然后用边将节点连接起来即可. 使用邻接表,文字上的描述就是,将所有节点放入一张邻接表中,对于每个节点的邻接节点,用一个链表将其连接起来. 1 邻接表中边.节点.图定义 1 typedef struct Edge 2 { 3 int adjvex; 4 struct Edge *nextEdge; 5 }Edge; 6 //顶点表 7 typedef struct VNode

以邻接表作为存储结构的图的深度优先遍历和广度优先遍历(c++版)

一.图的存储 用邻接表法存储图,存储结构分为两部分,一部分为存储图的所有顶点的数组,另一部分为挂载在数组的每个元素后面的用来表示顶点的邻接点的链表. 1.存储顶点的结构单元为: class vnode { public: string nodename; bool visted;//进行图的遍历时用于标记图是否被访问过 node *next; vnode() { visted = false; next = NULL; } }; 链表的结构单元为: class node { public: st

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间

数据结构之图(1)【邻接矩阵、邻接表】

邻接矩阵创建无向网: 图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图.一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 我们来看一个实例,图7-4-2的左图就是一个无向图. 我们再来看一个有向图样例,如图7-4-3所示的左图. 在图的术语中,我们提到了网的概念,也就是每条边上都带有权的图叫做网.那些这些权值就需要保存下来. 设图G是网图,有n个顶点,则邻接矩阵是一个n*n的

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

数据结构-图存储表示之邻接表

邻接表 在图论中,邻接表代表一个图中的所有边或弧. 邻接表存储表示,需要保存一个顺序存储的顶点表和每个顶点上的边的链接表. 邻接表(Adjacency List),即数组与链表相结合的存储方法. 如果是无向图,那么每条边由两个结点组成,分别代表边的两个端点: 如果是有向图,那么每条边是一个结点对,分别代表边的始点和终点. 一般来说,邻接表是无向的. 在计算机科学中,邻接表描述一种紧密相关的数据结构,用于表征图.在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即"邻接表&q