精华内容
下载资源
问答
  • 一行代码生成一棵圣诞Python 字符串这块可以玩出很多有意思的功能,今天我以一精简的字符串打印为例来展示。一棵小树print('*'.rjust(3),'*...

    一行代码生成一棵圣诞树

    Python 字符串这块可以玩出很多有意思的功能,今天我以一个精简的字符串打印为例来展示。

    一棵小树

    print('*'.rjust(3),'* *'.rjust(4),'* * *','|'.rjust(3),sep='\n')
    

    结果:

      *
     * *
    * * *
      |
    

    这行代码使用了rjust 函数,实现字符串靠右侧对齐。

    它的第一个参数指定字符串的长度,也就是说,'*'.rjust(3) 因为只有一个字符*,显然不够长度3,那么怎么办,默认用空格从左侧开始填充2个空格,此时长度不就是3个字符吗!

    再需要注意:print 的 sep 这个关键字参数,指明前面几个参数的分割符号。

    这棵树不带色彩,那么有没有办法变出一颗五彩斑斓的小树呢?

    一颗带颜色树

    print("\033[5;35;40m"+'*'.rjust(3)+"\033[0m",'* *'.rjust(4),'* * *','|'.rjust(3),sep='\n')
    

    结果:

    这是怎么做到的?与第一节相比,只是多了几个字符:"\033[5;35;40m",怎么解读?\033[ 可理解为格式化打印的前缀,其他字符含义:5表示显示方式为闪烁,35表示前景色为洋红,40m表示背景色为黑色

    1、显示方式:
    0(默认)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、 5(闪烁)、25(非闪烁)、7(反显)、27(非反显)
    
    2、前景色:
    30(黑色)、31(红色)、32(绿色)、 33(×××)、34(蓝色)、35(洋 红)、36(青色)、37(白色)
    
    3、背景色:
    40(黑色)、41(红色)、42(绿色)、 43(×××)、44(蓝色)、45(洋 红)、46(青色)、47(白色)
    

    如何做到五彩斑斓?第二、三行分别选用其他前景色:

    print("\033[5;35;40m"+'*'.rjust(3)+"\033[0m","\033[5;36;40m"+'* *'.rjust(4)+"\033[0m","\033[5;46;40m* * *\033[0m","\033[5;35;40m"+'|'.rjust(3)+"\033[0m",sep='\n')
    

    原创不易,欢迎点个在看

    展开全文
  • 分钟搞明白生成树和最小生成树的定义

    万次阅读 多人点赞 2017-11-15 07:57:53
    注意文字意思:不管是生成树还是最小生成树一定还是输,千万别和图...注意形成的一定是一棵树才是生成树。好了回到正题: 那么我们的生成树怎么在图的基础上生成的呢? 我们学了图应该知道2种遍历方法:1深度优先

    注意文字意思:不管是生成树还是最小生成树一定还是输,千万别和图混淆了。

    下面来说生成树:我们这棵树是针对图来说的,如果你们已经知道极小连通子图就非常简单了,
    极小连通子图什么意思呢,就是我们把图中的全部节点连接起来,假如n个节点那么,边是n - 1条。

    注意形成的一定是一棵树才是生成树。

    好了回到正题:
    那么我们的生成树怎么在图的基础上生成的呢?
    我们学了图应该知道有2种遍历方法:1深度优先遍历 2广度优先遍历
    深度优先遍历(DFS)是什么意思呢:假定一个起点比如下图所示:
    这里写图片描述

    假如我知道0的地址,我们使用深度优先遍历算法遍历当前的图:
    分析:深度字面意思一定要搞定这个意思就是说我们根据当前节点访问当前节点的一个孩子,然后在访问孩子节点的一个孩子节点,一直递归下去。直到全部节点访问完毕就停止访问,否则我们就退到上个节点从另一个孩子节点开始使用相同方式访问孩子节点。
    这里写图片描述

    分析:由深度优先遍历算法得到的生成树如上图;

    我们从起点0开始,找到0的第一个邻节点2, 因此0->2->3->4->1->5.
    这个序列是确定的吗,在这个图是确定的,先0我们在找邻节点我们假如在逆时针方位开始0开始找到第一个邻节点也就是2并且都标为访问过然后就找到2的邻节点3 在就是4在就是1,这个时候是不是有4个方位,但是只有5没有访问因此就是5 这个时候全部访问完毕。

    第二个办法就是广度优先算法生成树:

    这里写图片描述

    分析:我们来看看这个生成树是怎么形成的, 我们还是0开始,标志为被访问,
    然后由于是广度优先访问全部的邻节点在访问孩子的全部邻节点 0->2 1 5 3 4

    现在引入我们的最小生成树的定义:既然是最小在是生成树的基础上,在加上假如是带权值,那么生成树的很多种当中必有一个生成树权值和是最小,那么最小那棵树就是最小生成树。

    那么权值是什么意思,比如0节点和2节点之间我们可以看成是一个城市到一个城市的车费或者路程。
    那么最小就是走遍全部城市的车费或者路程最小。

    展开全文
  • T1是一棵含有百万节点的,T2含有节点。判断T2是否是T1 的子树。 首先考虑小数据量的情况,可以根据的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判断T2是否是T1的...

    T1是一棵含有几百万个节点的树,T2含有几百个节点。判断T2是否是T1 的子树。

    首先考虑小数据量的情况,可以根据树的前序和中序遍历所得的字符串,来通过判断T2生成的字符串是否是T1字符串的子串,来判断T2是否是T1的子树。假设T1的节点数为N,T2的节点数为M。遍历两棵树算法时间复杂性是O(N + M), 判断字符串是否为另一个字符串的子串的复杂性也是O( N + M)(比如使用KMP算法)。所需要的空间也是O(N + M)。

    这里有一个问题需要注意:对于左节点或者右节点为null的情况,需要在字符串中插入特殊字符表示。否则对于下面这种情形将会判断错误:

    因此如果插入特殊字符,上述两棵树的中序和前序遍历的结果是相同的。

    由于本例有几百万的节点,需要占用O(N + M)的内存。

    如果换一种思路,就是遍历T1,每当T1的某个节点与T2的根节点值相同时,就判断两棵子树是否相同。这个算法的复杂度是O(N*M)。我们再仔细思考一下。因为只有在节点值与T2的根节点值相同才会调用O(M)。假设有K次这种情况,那么算法的复杂度就是O(N + K*M)。下面是代码实现:

    struct TreeNode{
    	TreeNode *leftChild;
    	TreeNode *rightChild;
    	int data;
    };
    // check sub tree n1 == sub tree n2
     bool checkSubTree(const TreeNode* n1, const TreeNode* n2){
    	if( n1 == nullptr && n2 == nullptr )
    		return true;
    	
    	if( n1 == nullptr || n2 == nullptr )
    		return false;
    	
    	if( n1->data != n2->data )
    		return false;
    	
    	return checkSubTree(n1->leftChild, n2->leftChild) && checkSubTree(n1->rightChild, n2->rightChild);
    }
    bool subTree(const TreeNode *n1, const TreeNode *n2){
    	if( n1 == nullptr){
    		return false; // the bigger tree is empty, so t2 is not subtree of t1
    	}
    	
    	if( n1->data == n2->data){
    		if( checkSubTree(n1, n2))
    			return true;
    	}
    	
    	return subTree(n1->leftChild, n2) || subTree(n2->rightChild, n2);
    }
     
    

    对于上面讨论的2种解法,哪种解法比较好呢?其实有必要好好讨论一番:

    1)方法一会占用O(N + M)的内存,而另外一种解法只会占用O(logN + logM)的内存(递归的栈内存)。当考虑scalability扩展性时,内存使用的多寡是个很重要的因素。

    2)方法一的时间复杂度为O(N + M),方法二最差的时间复杂度是O(N*M)。所以要通过工程实践或者是历史数据看一下哪种方法更优。当然了,方法二也可能会很早发现两棵树的不同,早早的退出了checkSubTree。

    总的来说,在空间使用上,方法二更好。在时间上,需要通过实际数据来验证。

    展开全文
  • 最小生成树个

    千次阅读 2017-02-02 15:49:10
    在存在权值相等的边时,最小生成树可能。话不多说,求它数的方法如下:先用Prim生成最小树,同时记录边的关系。用并查集表示//不要压缩路径让每元素都指向它的父亲节点。找出权值相同的边,去除树上的这条...

    在存在权值相等的边时,最小生成树可能有多个。话不多说,求它个数的方法如下:

    先用Prim生成最小树,同时记录边的关系。用并查集表示//不要压缩路径

    这里写图片描述

    让每个元素都指向它的父亲节点。

    找出权值相同的边,去除树上的这条边,一棵树就被砍成了两颗,然后看加上另一条是否能连接这科树

    这里写图片描述

    方法就是这样,复杂度O(|E|log|E|)

    具体问题:

    输入

    第一行:T //代表T组数据
    每组数据:

    • V E //代表V个顶点 E条边
    • E行x y z//代表节点x到y的边长

    输出

    最小生成树的个数

    代码

    #include<stdio.h>
    #include<algorithm>
    #include<queue>
    #define MAX_V 102
    #define MAX_E 10002
    using namespace std;
    struct cell{int x,y,cost;};
    int par[MAX_V];
    bool used[MAX_V];
    cell cs[MAX_E],vs[MAX_V];//保存最小生成树的边
    int E,V;
    
    //不要压缩路径 通过并查集表示生成树
    void init(int n){for(int i=0;i<=n;i++) par[i]=i;}
    int find(int x){return x==par[x]?x:find(par[x]);}
    void unite(int x,int y){par[y]=x;}
    bool same(int x,int y){return find(x)==find(y);}
    
    bool cmp(cell a,cell b){return a.cost<b.cost;}
    bool operator < (cell a,cell b){return a.cost>b.cost;}
    int prim(){
        fill(used,used+V+1,false);
        init(V);
        priority_queue<cell> que;
        que.push({1,1,0});
        int u=0;
    
        while(!que.empty()){
            cell e=que.top();que.pop();
            int t=e.y;
            if(used[t]) continue;
            used[t]=true;
            unite(e.x,e.y);
            vs[u++]=e;
    
            for(int i=0;i<E;i++)//这儿可以用其他数据结构优化
                if(cs[i].x==t&&!used[cs[i].y])
                    que.push({t,cs[i].y,cs[i].cost});
        }
    
        E/=2;
        sort(cs,cs+E,cmp);
        sort(vs,vs+V,cmp);
        int j=0,k=0,N=1;
        while(j<E&&k<V){
            int va=cs[j].cost,vb=vs[k].cost;
            if(va==vb){
                if(!(cs[j].x==vs[k].x&&cs[j].y==vs[k].y)){
                    par[vs[k].y]=vs[k].y;//断开
                    if(!same(cs[j].x,cs[j].y)) N++;
                    par[vs[k].y]=vs[k].x;//接上
                }
                j++;
            }else if(va<vb){
                j++;
            }else{
                k++;
            }
        }
        return N;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&V,&E);
            for(int i=0;i<E;i++){
                scanf("%d%d%d",&cs[i].x,&cs[i].y,&cs[i].cost);
                cs[E+i].y=cs[i].x;
                cs[E+i].x=cs[i].y;
                cs[E+i].cost=cs[i].cost;
            }
            E*=2;
            int ans=prim();
            printf("%d\n",ans);
        }
        return 0;
    }
    展开全文
  • 证明N节点构成一棵树的种类数

    千次阅读 2015-11-01 15:18:15
     Cayley公式是说,一个完全图K_nn^(n-2)棵生成树,换句话说n节点的带标号的无根树n^(n-2)。今天我学到了Cayley公式的一个非常简单的证明,证明依赖于Prüfer编码,它是对带标号无根树的种编码方式。  ...
  • 生成树和最小生成树

    千次阅读 2018-03-13 15:29:22
    一、生成树的概念 一连通图的生成树是一极小连通子图,它含有图中全部顶点,但只有构成一棵树的(n-1)条边。如果在一棵生成树上添加一条边,必定构成一环。一棵n顶点的生成树(连通无回路图)且仅(n-1)...
  • n节点,n-1条边。
  • 图的生成树和最小生成树

    万次阅读 多人点赞 2017-11-26 22:37:14
     若同时满足边集E(G')中的所有边既能够使全部顶点连通而又不形成任何回路,则称子图G'是原图G的一棵生成树。  下面简单说明一下,在既能够连通图G中的全部n顶点又没有形成回路的子图G'(即
  • 最小生成树

    2018-03-09 09:28:45
    关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vivi与vjvj都路径相通,则称该无向图为连通图。强连通图:在向图中,若任意两个顶点vivi与vjvj都路径相通,则称该向图为强连通图。连通网:在连通...
  • 最小生成树(kruskal算法)

    万次阅读 多人点赞 2018-08-07 21:46:13
    接下来引入几个一看就明白的定义: 最小生成树相关概念: 带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树(MST):权值最小的生成树。 最小...
  • java 递归 生成树

    千次阅读 2018-01-11 16:48:46
    我的想法是,数据库中存的不一定是一棵树,也就是说最顶级的父节点不止一。 那就好办了: 1 先读取数据库中的所有数据存放到treeNodeList中。 2 然后遍历list,将其中的最顶级的父节点存到另一list ---father...
  • 生成树与快速生成树(STP、RSTP)原理

    万次阅读 多人点赞 2018-09-22 20:34:38
    表面上看生成树的作用是做设备冗余时,防止成环的种途径,但实际上可以避免做生成树,使用堆叠技术和虚拟化技术来达到防止出现环路的作用(将两设备做成一个设备,使得整个拓扑还是一个树状结构),所以生成树并...
  • 一、生成句法分析树把一句话按照句法逻辑组织成一棵树,由人来做这件事是可行的,但是由机器来实现是不可思议的,然而算法世界就是这么神奇,把一十分复杂的过程抽象成仅仅步操作,甚至不足10行代码,就能让机器...
  • Kruskal算法求最小生成树 ——HM ... 最小生成树只在一强连通的无向图中,删去条边,使剩下来的图是一棵树,且权值和尽可能小。 使一图变成树很容易,只要使图中的边的数量比点的...
  • 生成树协议 — STP

    万次阅读 多人点赞 2018-07-04 11:05:48
    4.1.1 实验目的(1)理解生成树协议STP的用途(2)理解生成树协议STP的工作过程(3)掌握根桥、根端口、指定端口的选举规则(4)掌握生成树协议STP中端口角色的变化(5)掌握基本生成树协议的配置4.1.2 实验原理1....
  • 推论1:由k棵树组成的森林满足m=n-k 证明:数学归纳法,任意去条边,则得到两连通分支,分别得证 连通且无圈 在G中任意不相邻的两顶点间增加条边,就得到唯一的一个圈 证明:由定理1,已经存在条路,...
  • 生成树

    千次阅读 2012-02-07 22:41:30
    生成树生成树协议——STP(SpanningTreepProtocol)能够提供路径冗余,使用STP可以使两终端中只有条有效路径。STP在大的网络中定义了一个树,并且迫使一定的备份路径处于备用状态。如果生成树中的网络部分不可...
  • 生成树 Spanning tree

    千次阅读 2019-05-02 15:13:48
    交换机之间存在冗余(备份)路径,以及交换机的泛洪机制,...、STP:spanning tree生成树(交换机之间对比比较信息BPDU,低的接口就阻塞 ) 生成树协议用于实现二层的线路冗余,在网络中逻辑的阻塞部分接口,来实...
  • 生成树原来这么简单

    千次阅读 2020-07-14 12:33:08
    生成树原来这么简单 文章目录生成树原来这么简单前言摘要什么是生成树生成树的作用?、STP1.1 背景1.2 STP增强特性1.2.1 portfast 端口加速1.2.2 backbonefast 骨干加速1.2.3 uplinkfast 上行链路加速1.2.4 BPDU...
  • 小编近日翻书,看见最小生成树问题,小编表示茫然不知最小生成树是干什么,看字面意思猜最小生成树就是自己造一棵树呗,然后,然后……就不知道什么用处了;听着这名字就一直当做是一种关于树的知识,没想到竟然...
  • 最小生成树详解

    千次阅读 2015-09-23 19:36:19
    对于无向图G=(V, E),V表示图中的结点,E表示图中的边,所谓最小生成树就是联通图G中所有结点所需要的边长度总和最小,这些边加上V就构成图G的颗最小生成树。这样还不清楚我们可以举例子:n城市分布在不同的...
  • 种特殊的生成树

    千次阅读 2013-10-08 11:17:29
    种特殊的生成树 分类: ACM•图论2012-05-02 09:22 399人阅读 评论(0) 收藏 举报 commandbuildclassstring算法ini 1.(严格)次小生成树 解法:1.依次删除树上的边后求最小生成树,判生成树唯一时只需...
  • 普利姆算法生成最小生成树

    千次阅读 2020-02-22 16:45:19
    普里姆算法介绍 普利姆(Prim)算法求最小生成树,也就是在包含 n顶点的...给定一带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树,如图 简而言之,最小生成树就是将图中所...
  • 简介求最小生成树一共两种算法,一个是就是本文所说的Kruskal算法,另一个就是Prime算法。在详细讲解Kruskal最小生成树算法之前,让我们先回顾一下什么是最小生成树。我们有一个带权值的图,我们要求找到一个所有...
  • 最小生成树及其构造方法

    千次阅读 2016-07-16 09:32:04
    最小生成树的概念以及怎么样利用普利姆算法和克鲁斯卡尔算法去构造一个图的最小生成树。利用通俗易懂的文字去步步描述了普利姆算法和克鲁斯卡尔算法的精华并且举例说明了核心思想
  • 在图论中,最小生成树也是种常用算法,本文将从一些有趣的例子和来讲诉最小生成树的prim算法和kruskal算法。中间也夹杂了马克思主义理论,!
  • 我们知道,无向图的最小生成树的求法Krusal和prime算法,一个是归点一个是归边,在具体实现上Krusal可以用并查集实现,难度不大。 这里稍微区别一下最短路径和最小生成树(因为我又搞混了23333) 最小生成树能够...
  • c++最小生成树代码

    千次阅读 2019-07-27 18:29:06
    //有几个0就是10的几次方 # define N 100000 结构体: 边edge、顶点node(node用于并查集) 全局数组:边集e,大小是边数上限、点集v,大小是顶点数上限 并查集中,顶点的root为true时该顶点是根节点;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,776
精华内容 17,910
关键字:

一棵树的生成树有几个