图存储-前向星

//前向星是将所有的边进行编号,每个节点u的边集合通过head[u]来找到u的第一条边,

//再通过next[head[u]]依次遍历节点u的所有边。

int head[maxn];
int to[maxn*2];
int next[maxn*2];
int cnt = 0;//边的编号 

memset(head, -1, sizeof(head));

inline void add(int x,int y){
to[cnt]=y,next[cnt]=head[x],head[x]=cnt++;
to[cnt]=x,next[cnt]=head[y],head[y]=cnt++;

}

inline void dfs(int u)
{
   int i;
    //从节点u的第一条边开始,遍历与u相连的所有边
    for(i=head[u];i!=-1;i=next[i])
    {
        dfs(to[i]);
    }
}
/*
head[i]:    以i为节点的边集的第一条边编号
next[i]:编号为i的边集中的下一条边编号,特定节点u的边的编号连成一个链表
to[i]:编号为i的边的终点
*/

//另一种实现

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100;
const int maxm = 100000;
typedef struct edgenode {
    int to; //边的终点
    int next; //当前下一条边的编号
    int w;  //边的权值
}edgenode;
int head[maxn]; //head[i]存放已i为起点的第一条边
edgenode edge[maxm];
int edgenum = 1;
int n = 0, m = 0;
int init() {
    edgenum = 1;
    memset(head, 0, sizeof(head));//chu shi hua 0;
    return 0;
}
int outputmap(){
    for (int i = 1; i <= n; i++) {
        for (int k = head[i]; k != 0; k = edge[k].next) {
            printf("(%d --- > %d) == %d\n", i, edge[k].to, edge[k].w);
        }
    }
    return 0;
}
int main() {
    init();
    int a = 0, b = 0, c = 0;
    while (scanf("%d%d", &n, &m) == 2) {
        for (int i = 0; i < m; i++) {
            scanf("%d%d%d", &a, &b, &c);
            edge[edgenum].to = b;
            edge[edgenum].w = c;
            edge[edgenum].next = head[a];
            head[a] = edgenum;
            edgenum++;
            edge[edgenum].to = a;
            edge[edgenum].w = c;
            edge[edgenum].next = head[b];
            head[b] = edgenum;
            edgenum++;
        }
        outputmap();
        init();
    }
    return 0;
}

图存储-前向星

时间: 2024-10-09 05:42:04

图存储-前向星的相关文章

浅谈图的前向星遍历

个人见解,如有错误,欢迎指出. 作为一个算法新手,我就从我个人的角度来讲述前向星这种算法,我看到大多数都是建立一个边集的结构体,然后在结构体内放入边指向结点,边的前驱,和边权: 例如: struct edge{//建立一个边集结构体     int next;//好一点的把next换成了pre,从字面上来讲更好理解     int w;//边的权值     int v;//边指向结点,有的写成to }e[maxn]; 当然对于一个已经懂得了前向星的人来讲,这种写法也还是比较好理解的.下面进入主题

PTA L2-023 图着色问题-前向星建图 团体程序设计天梯赛-练习集

L2-023 图着色问题 (25 分) 图着色问题是一个著名的NP完全问题.给定无向图,,问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色? 但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解. 输入格式: 输入在第一行给出3个整数V(0).E(≥)和K(0),分别是无向图的顶点数.边数.以及颜色数.顶点和颜色都从1到V编号.随后E行,每行给出一条边的两个端点的编号.在图的信息给出之后,给出了一个正整数N(≤),是待

【模板】链式前向星

用于存图的结构 在标准里,用于网络流的前向星和正常存图的前向星有区别 1 #define maxn 1000 2 struct qxx//用于正常存图 3 { 4 int tot,fr[maxn],to[maxn],nxt[maxn],w[maxn]; 5 void adde(int p,int q,int W) 6 {to[++tot]=q; w[tot]=W; nxt[tot]=fr[p]; fr[p]=tot;} 7 }; 8 ///////////////////////////////

图的存储结构:邻接矩阵(邻接表)&amp;链式前向星

[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组graph[ ][ ]来记录图中点a与点b之间是否连通,初始化为0(或者-1之类的看情况):如果图中有可忽略的重边(如 只需重边中的最小边或最大边),则保存需要的那条边的边权,但如果有无法忽略的重边,就一定不要用邻接矩阵. int graph[MAXN][MAXN]; void graphInit() { me

图的存储结构——前向星

前向星也是一种通过存储边信息的方式存储图的数据结构.他的构造方式非常简单,读入每条边的信息,将边存放在数组当中,把数组中的按照起点顺序排序,前向星就构造完成了.为了查询方便,经常会有一个数组存储起点为vi的第一条边的位置. 所需的数据结构如下: 1 int head[maxn]; 2 3 struct NODE{ 4 int from; 5 int to; 6 int w; 7 }; 8 NODE edge[maxm]; 存储 将所有边的信息读入,按照边的起点排序,如果起点相同,对于相同起点,如

图的存储:链式前向星(边集数组)

申明:本文中提及的所有存图结构都用静态数组实现,而非链表. 0.什么是链式前向星 链式前向星是一种存图的结构,例如前向星.邻接矩阵.边表.邻接表等也是存图的结构. 1.链式前向星有何优点 链式前向星:空间利用率高,在各类竞赛中常被使用. 邻接矩阵:需要开N*N的空间,在各类竞赛中常被卡. 邻接表:空间复杂度略小于邻接矩阵,但会被极端数据卡爆,且无法记录权值. 边表:无法迅速判断两点连通性,以至不适用于大多数图的算法. 前向星:具有排序操作,时间复杂度高. 2.同类结构介绍 邻接矩阵:开二维数组,

【数据结构】前向星存图

本文转自acdreamers的博客 原文网址: https://blog.csdn.net/ACdreamers/article/details/16902023 我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

建图方式一 之 ”前向星“ BFS&amp;&amp;DFS 简单应用

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include