数据结构(scheme) -- 抽象数据类型(ADT) -- 图
来源:互联网 发布:淘宝店铺商品找不到了 编辑:程序博客网 时间:2024/04/29 13:52
; ==================================================================================; 图,Graph; 无向图; ((0 1 2 4); (1 0 2); (2 0 1 3); (3 2 4); (4 1 3))(define g (graph))(graph-vertex-add g 0) ; 添加顶点(graph-edges-add g (cons 0 1)) ; 添加边(graph-vertex-remove g 0) ; 删除顶点(graph-edges-remove g (cons 0 1)) ; 删除边(graph-traverse g (lambda (i) (printf "v = ~d\n" i))) ; 深度优先遍历图(graph-vertex g) ; 获取图的顶点列表(graph-edges g 0) ; 获取图中与顶点0相连的顶点列表(graph-connected? g 1 3) ; 判断两顶点是否连通; =====================================================================================(define graph list)(define (graph-vertex g) (map car g))(define (graph-edges g v) (if (null? g) '() (if (= v (car (car g))) (cdr (car g)) (graph-edges (cdr g) v))))(define-syntax graph-vertex-add (syntax-rules () ((_ g v) (set! g (if (null? g) (list (cons v '())) (append g (list (cons v '()))))))))(define (graph-edges-add g p) (if (null? g) #f (if (= (car p) (car (car g))) (begin (set-cdr! (car g) (append (cdr (car g)) (list (cdr p)))) #t) (graph-edges-add (cdr g) p))))(define (zmap f ls) (if (not (null? ls)) (begin (f (car ls)) (zmap f (cdr ls)))))(define-syntax graph-vertex-remove (syntax-rules () ((_ g v) (if (not (null? g)) (begin (set! g (filter (lambda (p) (not (= v (car p)))) g)) (zmap (lambda (p) (set-cdr! p (filter (lambda (i) (not (= v i))) (cdr p)))) g))))))(define (graph-edges-remove g e) (zmap (lambda (p) (set-cdr! p (filter (lambda (i) (not (or (and (= (car p) (car e)) (= i (cdr e))) (and (= (car p) (cdr e)) (= i (car e)))))) (cdr p)))) g))(define (graph-traverse g f) (define (graph-node g i) (if (= i (car (car g))) (car g) (graph-node (cdr g) i))) (define (dfs p) (set-car! (cdr p) #t) (f (car p)) (zmap (lambda (i) (let ((q (graph-node g i))) (if (not (car (cdr q))) (dfs q)))) (cdr (cdr p)))) (zmap (lambda (p) (set-cdr! p (cons #f (cdr p)))) g) (zmap (lambda (p) (if (not (car (cdr p))) (dfs p))) g) (zmap (lambda (p) (set-cdr! p (cdr (cdr p)))) g)) (define (graph-connected? g v1 v2) (define res #f) (define (graph-node g i) (if (= i (car (car g))) (car g) (graph-node (cdr g) i))) (define (dfs p) (set-car! (cdr p) #t) (if (= v2 (car p)) (set! res #t) (zmap (lambda (i) (let ((q (graph-node g i))) (if (not (car (cdr q))) (dfs q)))) (cdr (cdr p))))) (zmap (lambda (p) (set-cdr! p (cons #f (cdr p)))) g) (dfs (graph-node g v1)) (zmap (lambda (p) (set-cdr! p (cdr (cdr p)))) g) res)
0 0
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 图
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 栈
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 队列
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 树
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 堆
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 链表
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 二叉查找树
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 平衡二叉树(AVL-Tree)
- 数据结构和抽象数据类型(ADT)简介
- 数据结构和抽象数据类型(ADT)简介
- 数据结构和抽象数据类型(ADT)简介
- 数据结构与算法 ADT(抽象数据类型)
- 数据结构--抽象数据类型(ADT)的表示与实现
- C ADT(抽象数据类型)
- ADT(抽象数据类型)
- 抽象数据类型ADT
- 抽象数据类型ADT
- 抽象数据类型(ADT)
- Sublime Text 3显示中文乱码
- 二叉查找树的删除
- 有用但很少知道的Linux命令
- PHP学习笔记1
- C++语言之类类型
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 图
- Char[N]字符串处理
- 关于WEB前端开发的工具
- HBase-scan API 通过scan读取表中数据
- Java在ACM中的使用
- An intro to modern OpenGL. Chapter 2.3: Rendering
- ApiDemos-->Views-lists-slow adapter学习
- 请你谈谈SSH整合
- Windows下Django1.6 + Apache2.2 + mod_WSGI 配置部署