20162328蔡文琛 week11 大二

20162328 2017-2018-1 《程序设计与数据结构》第十一周学习总结

教材学习内容总结

在无向图中,表示边的顶点对是无序的。

如果图中的两个顶点之间有边链接,则称它们是领接的。

如果无向图中连接顶点的边数达到最大,则称为完全图。

路径是图中连接两个顶点的边的序列。

第一个顶点和最后一个顶点相图且边不重复的路径称为环。

在有向图中,边是顶点的有序对。

有向图中的路径是连接图中两个顶点的有向边的序列。

图的每条边上都有对应的权值的图称为带权图。

图的深度优先遍历与广度优先遍历的主要差异在于用栈代替队列来管理便利的过程。

当且仅当从任意顶点的广度优先遍历中得到的顶点数等于图中所含的顶点数时,图是连通的。

生成树是包含图中所有顶点及图中部分边的一棵树。

生成最小树是其所含边的权值小于等于图的任意其他生成树的边的权值之和的生成树。

深度优先遍历

1.访问数组初始化:visited[n] = 0

2.访问顶点:visited[v] = 1

3.取v的第一个邻接点w;

4.循环递归:

while(w存在)

if(w未被访问过)

从顶点w出发递归执行;

w = v的下一个邻接点;

广度优先遍历

  1. 初始化队列:visited[n] = 0
  2. 访问顶点:visited[v] = 1
  3. 顶点v加入队列
  4. 循环:

    while(队列是否为空)

    v = 队列头元素

    w = v的第一个邻接点

    while(w存在)

    if(如果w未访问)

    visited[w] = 1;

    顶点w加入队列

    w = 顶点v的下一个邻接点

    有向图,无向图

    如果给图的每条边规定一个方向,那么得到的图称为有向图,其边也称为有向边。在有向图中,与一个节点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。相反,边没有方向的图称为无向图。

    带权图

    在处理有关图的实际问题时,往往有值的存在,比如公里数,运费,城市,人口数以及电话部数等。一般这个值成为权值,带权值的图称为带权图或赋权图。也称为网。

    最小生成树算法

public class WeightedGraph {
    private final int MAX_VERTS = 20; //最大顶点数
    private final int INFINITY = 100000; //最远距离...表示无法达到
    private Vertex[] vertexArray; //存储顶点的数组
    private int adjMat[][]; //存储顶点之间的边界
    private int nVerts; //顶点数量
    private int currentVert; //当前顶点索引
    private PriorityQ thePQ; //存储边的优先级队列
    private int nTree; //最小生成树中的顶点数量

    public WeightedGraph() {
        vertexArray = new Vertex[MAX_VERTS];
        adjMat = new int[MAX_VERTS][MAX_VERTS];
        for(int i = 0; i < MAX_VERTS; i++) {
            for(int j = 0; j < MAX_VERTS; j++) {
                adjMat[i][j] = INFINITY; //初始化所有边界无穷远
            }
        }
        thePQ = new PriorityQ();
    }

    public void addVertex(char lab) { //添加顶点
        vertexArray[nVerts++] = new Vertex(lab);
    }

    public void addEdge(int start, int end, int weight) {//添加带权边
        adjMat[start][end] = weight;
        adjMat[end][start] = weight;
    }

    public void displayVertex(int v) {
        System.out.print(vertexArray[v].label);
    }

    /*
     * 带权图的最小生成树,要选择一条最优的路径
     */
    public void MinSpanningTree() {
        currentVert = 0; //从0开始
        while(nTree < nVerts-1) { //当不是所有节点都在最小生成树中时
            //isInTree是上一节Vertex类中新添加的成员变量 private boolean isInTree;
               //表示有没有加入到树中,初始化为false
vertexArray[currentVert].isInTree = true; //将当前顶点加到树中
            nTree++;

            //往PQ中插入与当前顶点相邻的一些边界
            for(int i = 0; i < nVerts; i++) {
                if(i == currentVert) //如果是本顶点,跳出
                    continue;
                if(vertexArray[i].isInTree) //如果顶点i已经在树中,跳出
                    continue;
                int distance = adjMat[currentVert][i]; //计算当前顶点到i顶点的距离
                if(distance == INFINITY)
                    continue; //如果当前顶点与i顶点无穷远,跳出
                putInPQ(i, distance); //将i节点加入PQ中
            }

            if(thePQ.size() == 0) { //如果PQ为空,表示图不连接
                System.out.println("Graph not connected!");
                return;
            }

            Edge theEdge = thePQ.removeMin();
            int sourceVert = theEdge.srcVert;
            currentVert = theEdge.destVert;

            System.out.print(vertexArray[sourceVert].label);//这里就是一步步打印最小生成树的路径
            System.out.print(vertexArray[currentVert].label);
            System.out.print(" ");
        }
    }
    //这个方法是将一个Edge放入优先级队列,保证队列中每个Edge的des顶点是不同的。
    private void putInPQ(int newVert, int newDist) {
        int queueIndex = thePQ.find(newVert);//判断PQ中是否已经有到相同目的顶点的边界
        if(queueIndex != -1) { //如果有则与当前顶点到目的顶点的距离作比较,保留短的那个
            Edge tempEdge = thePQ.peekN(queueIndex);//get edge
            int oldDist = tempEdge.distance;
            if(oldDist > newDist) { //如果新的边界更短
                thePQ.removeN(queueIndex); //删除旧边界
                Edge theEdge = new Edge(currentVert, newVert, newDist);
                thePQ.insert(theEdge);
            }
        }
        else { //如果PQ中没有到相同目的顶点的边界
            Edge theEdge = new Edge(currentVert, newVert, newDist);
            thePQ.insert(theEdge);//直接添加到PQ
        }
    }
}
时间: 2024-11-06 09:38:16

20162328蔡文琛 week11 大二的相关文章

20162328蔡文琛 实验四 图的实现与应用

20162328蔡文琛 大二 实验四 任务详情 实验1 用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除结点的方法,添加和删除边的方法,size(),isEmpty(),广度优先迭代器,深度优先迭代器 实现类 public class MatrixUDG { private char[] mVexs; // 顶点集合 private int[][] mMatrix; // 邻接矩阵 /* * 创建图(自己输入数据) */ public boolean isEmpty(){ bool

20162328蔡文琛 第二学期课程总结

学号20162328 2016-2017-2<程序设计与数据结构>课程总结 每周作业链接汇总 第一周作业 算法+程序机构=程序 渐进复杂度称为算法的阶. 算法分析是计算机科学的基础课题 第三周作业 查找是在一组项内找到指定目标或是确定目标不存在的过程. 搞高效的查找使得比较的次数最少. Comparable接口允许许多动态实现算法,而不是指应用于特定的类. 二分查找的每次比较都排除了一半的可行候选数据. 排序是按某种标准将一列数据项按确定的次序重排的过程. 教材学习内容总结 教材学习中的问题和

20162328蔡文琛 实验五 数据结构综合应用

实验五:数据结构综合应用 课程:程序设计与数据结构 班级: 1623 姓名: 蔡文琛 学号:20162328 指导教师:娄嘉鹏 王志强 实验日期:12月15日 实验密级: 非密级 预习程度: 已预习 必修/选修: 必修 实验名称: 数据结构综合应用 实验内容: 1.分析系统架构 2.编译.运行.测试系统 3.修改系统 4.分析数据结构.排序.查找算法的应用 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 完成实验.撰写实验报告,

大二〕一直在寻找 生而为人的意义(转载)

来自: 孑 狐(生活总该有另一个出口) 2014-10-20 01:06:36 ◤ 明信片计划 ◢ 陌生人啊陌生人 我想给你们寄张明信片 只要你们豆邮我:一段话+地址 写什么都可以 天气 心情 食物 你喜欢的你不喜欢 不过最好是 你们的梦想和想要的生活 请随时用豆邮轰炸我吧吧吧 「About Me」 我是孑狐. 94年南方姑娘 出生在一座海滨城市 可是家的附近没有海. 目前大二 信管专业 我不知道如何去定义我 像只狮子又像只猫 亦庄亦邪 可却又是一只小狐狸. 偏双子的狮子座 INFP型理想主义人

说说大二这一年

今天早上8点去食堂吃早饭, 发现鸡蛋都卖完了... 大一的同学, 真是积极阿.这才真正意识到, 新学期到了, 而我, 也马上大三了. 离9月8号开学还有几天, 闲着, 写篇文章, 缅怀下我逝去的大二. 坐在实验室, 听着歌, 敲着键盘, 想想大二这一年, 有遗憾, 有收获, 总体还说, 还是挺精彩的. 课程篇: 1.java 这玩意, 不得不提, 我确实不喜欢. 当然, 没有对语言本身的看法, 只是从个人角度, 不太喜欢java. 可能是大一就接触iOS, 大一一年学习了C, C++(教学课程)

大二女生web开发成长之路——讲述我从软妹子到女汉子的进阶过程

学习和实践前端一年时间,几乎天天在工作室和一群屌丝男程序员一起学习.开发.这种潜移默化的环境下,编码提高了,节操也细碎了. 一年前,娇滴滴的还是工作室里面小师妹一枚,软软的软件工程妹子,做不到人见人爱,但在这个据说男女比例8比1的学校中,仍是比较受欢迎群体——女生中的一员. 然而,    回想过去这一年,跟一帮大老爷们坐在一起讲蛋疼的笑话: 工作室聚餐中满怀“邪”意地企图把师兄们灌醉: 为了赶项目,可以经常和某位苦逼男一起debug到两三点,不亦乐乎: 男生唤我作欣姐,各种玩笑各种开,因为都不拿

大二上學期學習生活總結

暑假的時候沒有回家,一直呆在學校學習.雖然沒能在外打工賺錢,不過卻學到了不少知識.對自己未來的付出.比賺生活費更有意義. 大一一年的學習之後,我對自身存在的不足有了進一步認識,也开始了新一波的奮鬥! [專業課] 這個學期幾乎全是專業課,包含C#.網頁設計. 操作系統.Linux.數據庫和計算機網絡. [計算機網絡]之前學過,後來期末考試的時候,感覺又忘得几乎相同了,雖然沒掛科,不過卻應該驚醒,閑了再翻翻看看. [C#]也是之前學過,在學期末的課程設計中使用SQLserver數據庫做了一個學生管理

答一名总是半途而废的大二学生:如何坚持,坚持什么

[来信] 我的一名普通二本学校的大二学生.马上要进大三了,感觉时间过得好快,我不是计算机专业的学生,但是对这个行业比较感兴趣,对计算机编程相对于其他事情要更加感兴趣些.高中毕业以前从未接触过计算机,到了大学由于是计算机相关专业(电子信息),家里给买了一台笔记本.到了大学,由于性格的原因,课外活动很少参与,只好上网,慢慢地对电脑熟悉起来了... 大一上期呢,在学姐那里借了本c语言看着玩,下学期学校开了c语言,由于事先看了一点,学起来的时候感觉还算不错.忘了说了,带电脑来学校就开始玩游戏了,,,直到

由蔡文胜骗股有感——技术人员,你除了技术,还有啥

近闻悉,中国著名天使投资人--蔡文胜,对其4399cto曹政股权被稀释一事,蔡文胜并未否认,他表示自己早已卸任4399董事长职务,股权的事是4399公司内部的事情.其中来龙去脉,作为局外人也不好评论,但程序员们,你们除了技术外,是不是要有另外立足与世界的本领. 不错,程序员,本应是一个神圣职业,你们正是利用你们手中武器改变这世界.但是,世界终归是人的世界,终归是情感的世界,不是机器的世界.所以了一般做技术的人,显得与这个世界显得格格不入.一般喜欢技术的人,就木讷,和机器相处多了,就显的更加的木讷