代码:

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文档就绪

    很多jQuery代码都有如下片段: $(document).ready(function(){ //代码 }) 作用就是等文档结构加载完成后再去执行function中的代码,功能类似于window.o ...

  2. JavaWeb项目中引入spring框架

    主要步骤有以下3步: 1:下载spring的jar包2:在项目中web.xml中添加spring配置3:bean配置文件-applicationContext.xml 1:引入包,这个就不说了,官网下 ...

  3. JS——if条件判断

    现在只说特殊情况: 1.一个变量,例如n1=null <script> var n1 = null; alert(n1);/*弹窗的值为null*/ if (n1 == null) {/* ...

  4. CSS——规避脱标流和vertical-align

    规避脱标流: 1.尽量使用标准流. 2.标准流解决不了的使用浮动. 3.浮动解决不了的使用定位. 问题解决:嵌套盒子在不使用定位的情况下定位到右上角 <!DOCTYPE html> < ...

  5. VMware 11安装Mac OS X 10.10 及安装Mac Vmware Tools.

    先上一张效果图兴奋一下,博主穷屌丝一个,只能通过虚拟黑苹果体验下高富帅的生活,感觉超爽的,废话不多说的,直接上图了! 目录: 1.安装所需软件下载: 2.Mac OS X10.10 安装基本步骤: 3 ...

  6. 详解HashMap数据结构实现

    HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...

  7. 【sqli-labs】 less49 GET -Error based -String -Blind -Order By Clause(GET型基于盲注的字符型Order By从句注入)

    都是order by的注入,作者连图片都懒得改了... 注意和整型的区别,前引号用提交的引号闭合,后引号用#注释 http://192.168.136.128/sqli-labs-master/Les ...

  8. IOS7 APP 升级的10个TIP 建议

    There is no way to preserve the iOS 6 style status bar layout. The status bar will always overlap yo ...

  9. SqlServer Function

    set quoted_identifier on; set ansi_nulls on; go create function [dbo].[Get_StrArrayStrOfIndex] ( @st ...

  10. JavaScript day4(条件语句和条件运算符)

    1. 布尔值 布尔值要么是 true 要么是 false .它非常像电路开关, true 是“开”,false 是“关”.这两种状态是互斥的. 2. if 语句 if 语句用于在代码中做条件判断.关键 ...