代码:

struct NODE{
int to;
int nxt;
int c;
}node[MM];//链式向前星
int head[NM],lcnt=;
void add(int a,int b,int c){
node[lcnt].to=b;
node[lcnt].c=c;
node[lcnt].nxt=head[a];
head[a]=lcnt++;
}

显示神奇代码

1.使用结构体构建链式向前星的容器

链式向前星本质上是使用链表存边,一条链表代表着一个点发出的所有边。所以一个这个结构体代表着这条链表中的一项

struct NODE{
int to; //指向下一条边
int nxt; //指向同一个点发出的另一条边
int c; //边权
}node[MM];//链式向前星

2.第一条边——head和边的编号

NM是一个常量,代表着点的数量;

head代表着一条链表的第一个项,也就是一个点所发出的第一条边(第一的意思是可以从这链表的这一项一直跳完所有项),至于如何实现请看 3 部分。

lcnt是赋予边编号的变量,之所以初始化为1,请看 4 部分。

int head[NM];
int lcnt=1;

3.三个变量一台戏——如何加边(add)

a,b,c分别代表入边,出边,权值

这个函数设置编号为lcnt的边,将to指向的是节点编号

重点在nxt的操作上。将nxt赋值为a节点的“第一条边”,那么就是说这个点接下来的可以跳的边或者说链表的项是 head[a]

接下来将”第一条边”赋值为当前的编号,那么下一次添加以a为源点的边可以跳的边或者说链表的项就是现在的边或者说项了。

那就意味着最后一次添加的边(项),可以一直跳到第一次添加的边(项),也就符合我们在第 2 条定义的“第一条边”了。

别忘了将编号++,以便下次使用。

void add(int a,int b,int c){     //改变编号为lcnt的边
node[lcnt].to=b; //出边指向b
node[lcnt].c=c; //记录权值
node[lcnt].nxt=head[a]; //将其指向目前的”第一条边“,也就是说能跳到”第一条边”
head[a]=lcnt++; //“第一条边”更新为目前的编号,那么下一条边能够跳到这一条边,那么最后的head自然就是真正的“第一条边”了;编号++一遍下次使用
}

  

 

4.遍历某个点所连接的所有边

要遍历就可以利用前面求出的”第一条边“和这些链表了。

自然可以用for,从一开始将循环变量i初始化为要遍历的源点k的”第一条边“,head[k]

在判断的时候,判断是否还有下一条边,这时候就是lcnt初始化为1的作用了。如果没有初始化为1,就会存在编号为0的点,判断就会误认为已经结束了。

于是判断就必须写i!=-1了,但是打"=1"只需要两个字符,而"i!=-1"比起"i"要多4个字符,而且不符合我们人类的思维习惯:从1开始,所以我们采用lcnt初始化为1

(“i”在C++里的意思是简写的 i!=0 )

然后到每次循环结束做的改变,自然是直接跳到链表的下一项。

for(int i=head[k];i;i=node[i].nxt){
int u=node[i].to;
//u就是所连接的点
     int v=node[i].c;
     //v就是边的权值
}

 

 

5.注意双向边

如果你的题目要求是双向边的话,加边操作需要进行两次:

add(a,b,c);
add(b,a,c);  

注意,这时候node数组需要开两倍于边数的空间

  

【数据结构】链式向前星知识点&代码的更多相关文章

  1. 【bfs+链式向前星】防御僵尸(defend)计蒜客 - 45288

    题目: A 国有 n 座城市,n−1 条双向道路将这些城市连接了起来,任何两个城市都可以通过道路互通. 某日,A 国爆发了丧尸危机,所有的幸存者现在都聚集到了 A 国的首都(首都是编号为 1 的城市) ...

  2. 图论 ---- spfa + 链式向前星 ---- poj 3268 : Silver Cow Party

    Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12674   Accepted: 5651 ...

  3. Tarjan模版(链式向前星表示方法)

    这道模版用到了链式向前星表示法: struct node { int v,next; }edge[]; void add(int x,int y) { edge[++cnt].next=heads[x ...

  4. 图论 --- spfa + 链式向前星 : 判断是否存在正权回路 poj 1860 : Currency Exchange

    Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 19881   Accepted: 711 ...

  5. 图论 --- spfa + 链式向前星 (模板题) dlut 1218 : 奇奇与变形金刚

    1218: 奇奇与变形金刚 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 130  Solved: 37[Submit][Status][Web Boa ...

  6. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  7. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  8. 数据结构-链式队列-C++

    用链表搭建的栈与队列相对简单,队列的特点是先进先出,不啰嗦了,由于代码比较简单,相信光顾的人不会太多,下面直接贴代码. 头文件 #ifndef QUEUELI_H #define QUEUELI_H ...

  9. c数据结构链式存储-静态链表

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

随机推荐

  1. Jquery EasyUI环境下设置下拉框选中指定选项

    前提: 要求点击某个按钮就将所有的下拉框都设置为选中第一个选项,因此,指定索引是最好的做法 尝试过的做法: html代码如下(easyui 的写法) <select class="ea ...

  2. SAS学习笔记之《SAS编程与数据挖掘商业案例》(2)数据获取与数据集操作

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(2)数据获取与数据集操作 1. SET/SET效率高,建立的主表和建表索引的查询表一般不排序, 2. BY语句,DATA步中,BY语句规定 ...

  3. Rsync 传输不需要输入密码

    1.背景 1)        一个作为服务器端:VM3(IP: 3.9.8.151) 2)        一个作为客户端:VM2(IP: 3.9.8.157) 3)        服务器端和客户端网络 ...

  4. SQL基本操作——通配符

    SQL 通配符:在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符.SQL 通配符必须与 LIKE 运算符一起使用.在 SQL 中,可使用以下通配符: 通配符 描述 % 替代一个或多个字符 ...

  5. 解决 i5 6500 安装黑苹果 Sierra 显卡不正常问题

    i5 6500内置HD 530显卡,装好Sierra显卡驱动不太正常. 先下载Clover configurator 用Clover configurator加载 EFI (Mount EFI)分区 ...

  6. 控制台输出(System.out.printf)的使用

    一.  介绍 System.out.printf 与 C语言中的 printf 使用方法类似,可以向控制台(Console) 输出指定格式的内容.使用  System.out.printf 的方法比使 ...

  7. HDU 3152 Obstacle Course(优先队列,广搜)

    题目 用优先队列优化普通的广搜就可以过了. #include<stdio.h> #include<string.h> #include<algorithm> usi ...

  8. js 图表转图片

    最近项目上有个需求,是将一些teechart做的图表转换成图片插入自动生成的PDF里,Teechart绘图和如何生成PDF这些这里就不说了,这个任务比较别扭的一点是,图表自动生成,且整个过程中页面不能 ...

  9. Charles 下载-破解-安装-配置

    我当前使用版本为V4.2.7 最新版本下载地址 Charles 在线破解工具 下载完之后,先进行安装,安装完之后,根据破解链接中的步骤来就ok了. 比较费劲配置在下面,不过跟着一步步来就一定能好的 点 ...

  10. hdu 5182 PM2.5

    问题描述 目前,我们用PM2.5的含量来描述空气质量的好坏.一个城市的PM2.5含量越低,它的空气质量就越好.所以我们经常按照PM2.5的含量从小到大对城市排序.一些时候某个城市的排名可能上升,但是他 ...