特殊“邻接表”建图方法
来源:互联网 发布:程序员接私活 编辑:程序博客网 时间:2024/06/04 18:24
(此文借鉴 dollarzhaole 的 《邻接表建图方法及代码》 )
说明:
建立有向图(稍加更改可变为无向图);
第一行输入n 表示边数;
随后n行输入a, b, c 分别表示边的起点, 终点, 权值;
输入示例:
5
3 4 6
3 7 8
1 3 6
2 4 7
3 5 1
图示例:
方法:
利用数组和结构体模拟边与边的关系, 极大的节省空间和时间;
图示解析:
代码:
1.有向图:
#include <stdio.h>#include <string.h>#define N 100struct Edge{//此结构体表示边int start;//边起点int end;//边终点int weight;//权值int next;//下一个与start有关的边};int first[N];//存储以下标为起点的边的(最后)位置Edge e[N] ;//存储边的具体信息void Build_Graph()//建图{int edges;//边数memset(first, -1, sizeof(first));//-1表示该起点不存在连边scanf("%d", &edges);for(int i = 0; i < edges; i ++){scanf("%d%d%d", &e[i].start, &e[i].end, &e[i].weight);//输入节点信息e[i].next = first[e[i].start];first[e[i].start] = i;/* first数组存储的是"最新的"以下标i为起点的边在e数组中的位置, 所以有新数据都要先修改过first, 类似单链表的头插法; 但在更改first[i]的值前, 应先修改边的next值为first[i]的当前值,犹如单链表头插前要修改 newnode ->next = head ->next;*/}}void Print_Graph(){ for(int i = 1; i < 10; i ++)//输出图 10暂且表示顶点最大值 { if(first[i] == -1) continue;//该起点没边 printf("以%d为起点的所有边的信息:\n", i); for(int j = first[i]; j != -1; j = e[j].next)//遍历以j为起点的所有边的信息 printf("%d %d %d\n", e[j].start, e[j].end, e[j].weight); printf("\n"); }}int main(){Build_Graph();Print_Graph();return 0;}
2.无向图:
#include <stdio.h>#include <string.h>#define N 100struct Edge{//此结构体表示边int start;//边起点int end;//边终点int weight;//权值int next;//下一个与start有关的边};int first[N];//存储以下标为起点的边的(最后)位置Edge e[N] ;//存储边的具体信息void Build_Graph()//建图{int edges;//边数(关系数)memset(first, -1, sizeof(first));//-1表示该起点不存在连边scanf("%d", &edges);for(int i = 0; i < edges * 2; i ++){scanf("%d%d%d", &e[i].start, &e[i].end, &e[i].weight);//输入节点信息e[i].next = first[e[i].start];first[e[i].start] = i;i ++;//无向图增加代码e[i].start = e[i - 1].end;e[i].end = e[i - 1].start;e[i].weight = e[i - 1].weight;e[i].next = first[e[i].start];first[e[i].start] = i;/* first数组存储的是"最新的"以下标i为起点的边在e数组中的位置, 所以有新数据都要先修改过first, 类似单链表的头插法; 但在更改first[i]的值前, 应先修改边的next值为first[i]的当前值,犹如单链表头插前要修改 newnode ->next = head ->next;*/}}void Print_Graph(){ for(int i = 1; i < 10; i ++)//输出图 10暂且表示顶点最大值 { if(first[i] == -1) continue;//该起点没边 printf("以%d为起点的所有边的信息:\n", i); for(int j = first[i]; j != -1; j = e[j].next)//遍历以j为起点的所有边的信息 printf("%d %d %d\n", e[j].start, e[j].end, e[j].weight); printf("\n"); }}int main(){Build_Graph();Print_Graph();return 0;}
- 特殊“邻接表”建图方法
- 图的邻接表的表示方法
- 邻接表的建图
- 图基本算法 ,图的表示方法 邻接矩阵 邻接表
- ACM中关于图的邻接表的表示方法
- 数据结构之图的邻接表存储方法
- 图的邻接表数据结构的C++实现方法
- 图的邻接表
- 图的邻接表
- 图的邻接表
- c++ 图(邻接表)
- 图 邻接表
- 图的邻接表
- 图-----邻接表
- 图 邻接矩阵 邻接表
- 图的邻接表
- 邻接表与图
- 图(邻接表)
- Android中如何修改系统时间(应用程序获得系统权限)
- 计算1/2-2/3+...+19/20
- 浅谈arm开发板SD卡和NAND的启动过程
- Android之Junit测试框架配置
- 试设计一个算法,将元素e插入L中合适的位置,使插入后L仍为非递减有序。
- 特殊“邻接表”建图方法
- ubuntu 13.10调节亮度
- 画棋盘
- Java 基础类型转换byte数组, byte数组转换基础类型
- ERROR security.UserGroupInformation: PriviledgedActionException 解决方法
- C#实现不安装Oracle客户端访问远程oracle服务
- 威威猫系列故事——因式分解
- HP-UX中filecache的设置
- java swt 功能 简介 大全 控件 windows builder