`
yzmduncan
  • 浏览: 330349 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

ACM中关于图的邻接表的表示方法

阅读更多

    最近做图的题比较多,除了克鲁斯卡尔和floyd,像广搜,普里姆,Bellman-Ford,迪杰斯特拉,SPFA,拓扑排序等等,都用到图的邻接表形式。

 

    数据结构书上表示邻接表比较复杂,一般形式如下:

 

typedef struct Node
{
	int dest;					//邻接边的弧头结点序号
	int weight;					//权值信息
	struct Node *next;			//指向下一条邻接边
}Edge;							//单链表结点的结构体

typedef struct
{
	DataType data;				//结点的一些数据,比如名字
	int sorce;					//邻接边的弧尾结点序号
	Edge *adj;					//邻接边头指针
}AdjHeight;						//数组的数据元素类型的结构体

typedef struct
{
	AdjHeight a[MaxVertices];	//邻接表数组
	int numOfVerts;				//结点个数
	int numOfEdges;				//边个数
}AdjGraph;						//邻接表结构体

 

    其实有种简洁且高效的表示形式:

typedef struct
{
	int to;
	int w;
	int next;
}Edge;
Edge e[MAX];
int pre[MAX];

//初始化
memset(pre,-1,sizeof(pre));

//输入
scanf("%d %d %d",&from,&to,&w1);
e[i].to = to; e[i].w = w1; e[i].next = pre[from]; pre[from] = i;
i++;

    上面这段代码中,边的结构体Edge由三个元素组成:弧头结点序号,边权值,下一条边的序号。e[i]指的是第i条边。pre[i]记录的是从当前输入的情况来看,序号为i的弧尾结点发出的第一条边的序号是pre[i]。

    这样,在操作某个结点发出的边时,可以像这么做:

/*now为弧尾结点序号,i为now所发出的边序号,adj为弧头结点序号,w为now-->adj这条边的权值*/
for(i = pre[now]; i != -1; i = edge[i].next)
{
     int adj = edge[i].to;
     int w = edge[i].w;
     //do something...
}

   

    其实,对于哈希表这类的存储结构(链表法解决冲突),与图的邻接表类似,也可以用类似的表示方法:

typedef struct
{
	char e[11];    //value
	char f[11];     //key
	int next;        //下一个结果(hash冲突)
}Entry;
Entry entry[M];
int hashIndex[M];   //哈希值为M的结果集的第一个在entry中的序号。

//输入:对key进行hash,
sscanf(str,"%s %s",entry[i].e,entry[i].f);
int hash = ELFHash(entry[i].f);
entry[i].next = hashIndex[hash];
hashIndex[hash] = i;
i++;

//使用:
for(int k = hashIndex[hash]; k; k = entry[k].next)
{
    //do something..
}

 

 

 

 

 

 

 

  • 大小: 25.4 KB
1
0
分享到:
评论

相关推荐

    ACM图模型与搜索算法讲稿破解版

    邻接表通过链表来存储每个节点的所有邻接节点,对于无向图和有向图均可使用,同时还可以扩展为存储权重信息的邻接表。邻接表的优点在于查询某个节点的邻接节点时更为快速,尤其是在处理大规模图数据时效率更高。 ##...

    ACM经典代码ACM

    1. 二分图最大匹配(hungary 邻接表形式):Kuhn-Munkres算法(匈牙利算法)用于求解二分图的最大匹配问题,是网络流算法的一种应用。 2. 二分图最大匹配(hungary 邻接表形式,邻接阵接口):同样的算法,但以不同的...

    ACM常见单词.pdf

    - adjacency list(邻接表)与 adjacency matrix(邻接矩阵):用于表示图的两种常见数据结构,分别用于记录顶点间的关系。 - array(数组):连续内存空间中存储相同类型数据的结构。 - binary search tree...

    ACM资料

    - **图结构**:图可以表示问题的复杂关系,例如邻接矩阵和邻接表是常见的表示方法。 - **堆**:优先队列的实现,如最小堆和最大堆,常用于求解最大值或最小值问题。 - **哈希表**:快速查找和插入数据,提供接近...

    kuangbin的ACM模板(新)_ACM模板_ACM算法总结_

    - 图的表示:邻接矩阵和邻接表,根据问题选择合适的表示方法。 - 图的连通性:判断强连通、弱连通,寻找最小生成树(Kruskal、Prim算法)。 - 拓扑排序:有向无环图的排序方法,常用于任务调度。 - 最小路径覆盖...

    吉林大学ACM模板 经典的ACM模版

    例如,二叉搜索树用于快速查找,AVL或红黑树保持平衡,哈希表实现快速查找和插入,堆实现优先队列,图的邻接矩阵或邻接表存储方便进行遍历。 模板可能还会涵盖动态规划、回溯法、贪心策略等常见算法,以及如何进行...

    ACM经典代码(可比赛用)

    1. **二分图最大匹配(hungary 邻接表形式)**:采用Kuhn-Munkres算法(匈牙利算法),求解二分图中的最大匹配,广泛应用于分配问题。 2. **二分图最大匹配(hungary 邻接表形式,邻接阵接口)**:同样的算法,但接口...

    ACM算法模板集锦(几何,结构,其他,数论,数值计算,图论)

    二分图最大匹配(hungary邻接表形式,邻接阵接口) 二分图最大匹配(hungary正向表形式) 二分图最佳匹配(kuhn_munkras邻接阵形式) 一般图最大匹配(邻接表形式) 一般图最大匹配(邻接阵形式) 一般图最大匹配(正向表...

    ACM-ICPC_algorithm_template.pdf

    + 有向图强连通分量 Tarjan 算法(Tarjan 算法+静态邻接表) + 有向图强连通分量 Gabow 算法 + 无向图连通分支(dfs/bfs 邻接阵) + 有向图强连通分支(dfs/bfs 邻接阵)O(n^2) + 有向图最小点基(邻接阵)O(n^2) * ...

    ACM经典算法及例子

    2. 二分图最大匹配(hungary邻接表形式,邻接阵接口) 10 3. 二分图最大匹配(hungary邻接阵形式) 10 4. 二分图最大匹配(hungary正向表形式) 11 5. 二分图最佳匹配(kuhn_munkras邻接阵形式) 11 6. 一般图匹配(邻接表形式...

    ACM题集-ACM训练题集-超多ACM题集汇总-解题源码

    2. **数据结构**:链表、数组、栈、队列、堆、树(二叉树、平衡树如AVL和红黑树)、图(邻接矩阵、邻接表等)以及跳跃表等。 3. **图论**:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra、...

    浙江大学ACM部分答案

    - **数据结构理解**:掌握如何使用邻接矩阵或邻接表表示图。 - **深度优先搜索(DFS)或广度优先搜索(BFS)**:通过递归或队列实现遍历。 - **路径查找与最优化**:在图中寻找特定路径或最优解。 综上所述,ACM...

    acm经典代码

    4. **二分图最大匹配(hungary 正向表形式)**:采用正向边表示图的邻接表,实现匈牙利算法。 5. **二分图最佳匹配(kuhn_munkras 邻接阵形式)**:Kuhn-Munkres算法,也称为KM算法,用于寻找二分图的最佳匹配。 6. **...

    ACM 图论知识大全

    2. **图的表示**:图可以用邻接矩阵或邻接表来表示,这两种数据结构各有优劣,适用于不同的算法场景。 3. **遍历算法**:深度优先搜索(DFS)和广度优先搜索(BFS)是图论中的基本操作,用于访问图的所有顶点。它们...

    ACM常用模板总结ACM常用模板总结

    二分图最大匹配(hungary邻接表形式,邻接阵接口) 二分图最大匹配(hungary正向表形式) 二分图最佳匹配(kuhn_munkras邻接阵形式) 一般图最大匹配(邻接表形式) 一般图最大匹配(邻接阵形式) 一般图最大匹配(正向表...

    非常经典的acm程序代码

    2. 二分图最大匹配(hungary邻接表形式,邻接阵接口) 10 3. 二分图最大匹配(hungary邻接阵形式) 10 4. 二分图最大匹配(hungary正向表形式) 11 5. 二分图最佳匹配(kuhn_munkras邻接阵形式) 11 6. 一般图匹配(邻接表...

    ACM单词.docx

    1. **邻接表(Adjacency List)**:在图论中,邻接表是一种存储图的方式,它为每个顶点存储一个列表,包含了与其相邻的所有顶点。 2. **邻接矩阵(Adjacency Matrix)**:另一种图的表示方法,是一个二维数组,其中的每...

    ACM浙大的模板 可以直接套用的

    **8.1 二分图最大匹配(hungary邻接表)** - 使用匈牙利算法求解二分图的最大匹配问题。 - 如实现增广路径的查找。 **8.2 二分图最大匹配(hungary邻接阵)** - 同上,但使用邻接矩阵代替邻接表。 **8.3 二分图最大...

    浙江大学ACM模板

    **8.1 二分图最大匹配(hungary邻接表)** - 匈牙利算法在二分图最大匹配问题中的应用。 - 如何实现匈牙利算法。 **8.2 二分图最大匹配(hungary邻接阵)** - 使用匈牙利算法求解二分图最大匹配问题的另一种实现...

    POJ3436-ACM Computer Factory

    4. 数据结构:可能用到的包括队列(用于BFS)和图的表示(邻接矩阵或邻接表)。 5. 动态规划:虽然题目中没有明确提及,但在某些复杂情况下,可能需要结合动态规划来优化解决方案。 6. 错误调试:编程过程中,错误...

Global site tag (gtag.js) - Google Analytics