精华内容
下载资源
问答
  • 判断一个有向图

    千次阅读 2012-07-14 04:24:07
    1. 有且仅有一个节点,入度0,即根 2. 其他节点,入度皆1 3. 从跟开始广度搜索 所遍历的节点数 应当与有向图中的节点数相等

    1. 有且仅有一个节点,入度为0,即为根

    2. 其他节点,入度皆为1

    3. 从跟开始广度搜索 所遍历的节点数 应当与有向图中的节点数相等

    展开全文
  • 树转化为二叉树表示

    千次阅读 2016-08-05 20:14:45
    二叉树在数据结构的重要性是因为...如果需要将上转换二叉树,也就是由N个分支转换2个分支。我们可以把每一个拥有同一父节点的子节点,也就是兄弟结点右连接起来。保留最左边的父子连接,将其他的父子连接都

    二叉树在数据结构的重要性是因为所有的树都可以通过简单的转换,而称为一棵二叉树。

    一般的树,每个结点都会有n个分支,这样处理起不同的分支的树都需要重新设计一套操作方案,而且空指针的问题会比二叉树更加的严重。来看一个例子,如下一颗树
    这里写图片描述

    如果需要将上图的树转换为二叉树,也就是由N个分支转换为2个分支。我们可以把每一个拥有同一父节点的子节点,也就是兄弟结点向右连接起来。保留最左边的父子连接,将其他的父子连接都打断,这时就可以产生一棵新的二叉树。
    如图
    这里写图片描述
    调整一下
    这里写图片描述


    简单叙述一下过程

    1. 1是根结点2、3、4是兄弟结点,则保留最左边的2结点其与1为父子关系,2是1的左孩子。将34结点依次链接到2结点的右边。
    2. 5、6是2的子结点,5、6为兄弟结点,则保留最左边的5结点与2为父子关系,5是6的左孩子,6结点链接在5结点的右边
    3. 7是3的子结点,7没有兄弟结点,则保留7结点与3结点的父子关系。7是3的左孩子
    4. 8、9、10是4结点的子结点,8、9、10为兄弟结点,则保留最左边的8结点与4为父子关系,8是4的左孩子,910结点依次连接在8结点的右边
    5. 二叉树转换完毕。
    展开全文
  • 无根树转化为有根树

    千次阅读 2016-02-04 23:16:50
    离散数学中,无根指无环连通无向图。 一棵无根是一个二元组(v,e),其中:1.V是非空集合,称为顶点集。2.E是V中元素构成的无序二元组的集合,称为边集。 直观来说,若一个图中每条边都是无方向的,则称为无向图...

    离散数学中,无根树指无环连通无向图。
    一棵无根树是一个二元组(v,e),其中:1.V是非空集合,称为顶点集。2.E是V中元素构成的无序二元组的集合,称为边集。
    直观来说,若一个图中每条边都是无方向的,则称为无向图。无向图中的边均是顶点的无序对,无序对通常用圆括号表示。无根树它要求每个顶点之间都直接或间接相连,且图中没有环,即只有简单路径。
    由于树是图的子集,这一类图具有树的特征,但不具有树状的形式,没有特定的根节点,故称为无根树。
    任意选取图中某个点为根,均可将无根树转化成为有根树。

    #include <iostream>
    #include <vector>
    #include <cstdio>
    
    using namespace std;
    
    vector<int> v[100];
    int p[100];
    void dfs(int p1, int p2)
    {
        for(int i = 0; i < v[p1].size(); i++)
        {
            int h = v[p1][i];
            if(h != p2)dfs(h, p[h] = p1);
        }
    }
    int main()
    {
        int root, n;
    
        cin >> root >> n;
        for(int i = 1; i < n; i++)//n个定点有n-1条边
        {
            int a, b;
            cin >> a >> b;
            v[a].push_back(b);
            v[b].push_back(a);
        }
        p[root] = -1;
        dfs(root, -1);
    }
    
    展开全文
  • 题意:给一个n节点的有向无环,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边,如果v要到u去,则要逆转该边方向)如果有多个这样的点,则升序输出所有 思路:把边的方向化为权值,正向1,逆向0...

    恭喜一下自己……这题没看题解做出来的(虽然思路不小心瞄到了一眼)

    题意:给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到u去,则要逆转该边方向)如果有多个这样的点,则升序输出所有


    思路:把边的方向化为权值,正向为1,逆向为0。

    问题转化为找哪些点的在遍历全图后总权值最大。

    这就是树形DP了,考虑每个节点,它可以从子树收获价值,也可以从父亲收获。所以dfs两遍,一边把子树的价值存到dps[i]里,再一遍把父亲的价值存到dpf[i]里。ans[i] = dps[i] + dpf[i]。这都是老套路了!

    按照题意再想个办法记录一下哪些点是最大。

    总的来说这题还是简单

    【代码】

    /* ***********************************************
    Author        :angon
    
    ************************************************ */
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    #define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)
    #define lld %I64d
    #define REP(i,k,n) for(int i=k;i<n;i++)
    #define REPP(i,k,n) for(int i=k;i<=n;i++)
    #define scan(d) scanf("%d",&d)
    #define scanl(d) scanf("%I64d",&d)
    #define scann(n,m) scanf("%d%d",&n,&m)
    #define scannl(n,m) scanf("%I64d%I64d",&n,&m)
    #define mst(a,k)  memset(a,k,sizeof(a))
    #define LL long long
    #define N 200005
    #define mod 1000000007
    inline int read(){int s=0;char ch=getchar();for(; ch<'0'||ch>'9'; ch=getchar());for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';return s;}
    
    struct Edge
    {
        int v,w,next;
    }edge[N*2];
    int head[N],tot;
    void addedge(int u,int v,int w)
    {
        edge[tot] = (Edge){v,w,head[u]};
        head[u] = tot++;
    }
    
    int dps[N],dpf[N];
    
    void dfs(int u,int fa)
    {
        for(int i=head[u]; ~i;i=edge[i].next)
        {
            int v=edge[i].v;
            int w=edge[i].w;
            if(v==fa) continue;
            dfs(v,u);
            dps[u] += w;
            dps[u] += dps[v];
        }
    }
    
    void dfs2(int u,int fa)
    {
        for(int i=head[u]; ~i;i=edge[i].next)
        {
            int v=edge[i].v;
            int w=edge[i].w;
            if(v==fa) continue;
            dpf[v] = dpf[u] + (w?0:1) + dps[u] - dps[v] - w;
            dfs2(v,u);
        }
    }
    
    struct node
    {
        int v,id;
    }ans[N];
    bool cmp(node a,node b)
    {
        return a.v>b.v || a.v==b.v&&a.id<b.id;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        int n; scan(n);
        mst(head,-1); tot=0;
        int u,v;
        REP(i,1,n)
        {
            scann(u,v);
            addedge(u,v,1);
            addedge(v,u,0);
        }
        mst(dps,0);
        dfs(1,-1);
        dfs2(1,-1);
        for(int i=1;i<=n;i++)
        {
            ans[i].v = dps[i]+dpf[i];
            ans[i].id = i;
            //printf("i=%d %d %d\n",i,dps[i],dpf[i]);
        }
        sort(ans+1,ans+n+1,cmp);
        int num=1;
        int sum = n-1 - ans[1].v;
        for(int i=2;i<=n;i++)
            if(ans[i].v==ans[1].v)
                num++;
        printf("%d\n",sum);
        for(int i=1;i<=num;i++)
            printf("%d%c",ans[i].id,i==num?'\n':' ');
        return 0;
    }


    展开全文
  • 、森林与二叉树相互转化原理

    千次阅读 2018-12-05 21:22:45
    1、转换二叉树 由于二叉树是有序的,为了避免混淆,对于无序,我们约定中的每个结点的孩子结点按从左到右的顺序进行编号。 将转换成二叉树的步骤是: (1)加线。就是在所有兄弟结点之间加一条连线; ...
  • 有向图删除边得到有向无环图

    千次阅读 2019-04-26 00:30:05
    给定用邻接表表示的有向图G,从G中删除一些边,将G转化为有向无环图 具体思路 判定是否是有向图可以通过DFS或者拓扑排序来完成,笔者采用的是DFS的方式。具体的思路:对图进行DFS,在每一个没有被访问的过的结点做...
  • 对于无向图,完全图:任意两个结点之间都直接相连的路径  连通图:指任意两个结点之间都一个路径相连. 这里的路径可以是间接的  生成:是通过对图的一次遍历(深度or广度)产生的,本质上是一棵,它拥有...
  • 图(有向图、无向图)

    万次阅读 2013-12-03 17:02:06
    ⑶均为图 (Graph),它若干个不同的点 v 1, v 2, …, v n,在其中一些点之间用直线或曲线连接。中的这些点被称为顶点 (vertex)或结点,连接顶点的曲线或直线称为边 (edge)。通常将这种由若干个顶点...
  • 有向图中打印所有的环路

    千次阅读 2017-06-10 13:34:47
    最近项目中需要研究了一下有向图的环路问题。一个IT企业中有成千上万个应用,各个应用之间都是相互依赖的,一个用户请求...这样所有的应用形成一个有向图,那么如果这个有向图中出现了环路,就悲剧了,用户的请求
  • 有向图的邻接矩阵类

    千次阅读 2009-01-14 07:57:00
    /* Name: 有向图的邻接矩阵类 Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和... 实现了有向图的邻接矩阵类,以及要用到的并查集类,最小生成类和最小堆类。 实现了有向图的深度优先搜索
  • 有向图的邻接表类

    千次阅读 2009-01-14 08:42:00
    /* Name: 有向图的邻接表类 Copyright: 始发于goal00001111的专栏;允许自由转载,但必须注明作者和... 实现了有向图的邻接表类,以及要用到的并查集类,最小生成类和最小堆类。 实现了有向图的深度优先搜索(包括
  • 转换为树-最小生成

    千次阅读 2015-12-27 21:47:35
    利用prims和kruskal两种方法实现最小生成。 直接上code吧。记录下 #include #include #define MAX 10 #define VertexNum 5 struct List { int v1; int v2; int weight; int marked; struct List *...
  • 有向图无向图判断有环(求环的长度)

    千次阅读 2018-06-13 12:39:18
    东北地区赛个无向图判自环的题当时没苟出来,回来之后想了想用并查集可以实现,然后仔细查了一波还有哪些方法…… 总结一波博客吧QAQ…… 资源来源: ... ... ...
  • https://cs.brown.edu/~rt/gdhandbook/http://cs.brown.edu/~rt/papers/gd-tutorial/gd-constraints.pdfhttp://graphics.stanford.edu/courses/cs448b-02-winter/lectures/treesgraphs/tree.graph.pdfhttp://...
  • 判断无向图中是否回路

    万次阅读 多人点赞 2014-12-15 17:05:10
     在有向图中,先找出入度0的顶点,删除与这个顶点相关联的边(出边),将与这些边相关的其它顶点的入度减1,循环直到没有入度0的定点。如果此时还有未被删除顶点,则必存在环路,否则不存在环路。
  • Prim算法——求无向图的最小生成

    千次阅读 2015-12-27 21:54:32
    1212 无向图最小生成基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注N个点M条边的无向连通图,每条边一个权值,求该图的最小生成。Input第1行:2个数N,M中间用空格分隔,N点...
  • 图的深度优先遍历 和 广度 优先 遍历 算法中的 每一次 最外层 循环 都 产生 一个 无向图 的 连通分量,每一个连通分量,都可以产生一个生成,将这些生成合在 一起 就是 一个 森林。 用 的 孩子 兄弟 链表 表示...
  • Prufer 数列,可以用来解一些关于无根计数的... (1)无根树转化为 Prufer 序列。 首先定义无根中度数 111 的节点是叶子节点。 找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只...
  • | 深度优先生成和广度优先生成

    万次阅读 多人点赞 2018-11-07 17:52:40
    本章的第一节中,介绍了有关生成和生成森林的有关知识,本节来解决...例如,图 1 中的无向图是由 V1~V7 的顶点和编号分别 a~i 的边组成。当使用深度优先搜索算法时,假设 V1 作为遍历的起始点,涉及到的顶点和...
  • 连通图的割点、割边(桥)、块、缩点,有向图的强连通分量   【本文摘选自百度文库】 一、基本概念 无向图 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图。 块:没有割点的连通子图...
  • 数据结构-的生成问题

    千次阅读 2019-08-28 10:53:23
    一、无向图的连通分量和生成 若图是连通的或强连通的,则从图中某一个顶点出发可以访问到图中所有顶点; 若图是非连通的或非强连通图,则需从图中多个顶点出发搜索访问。而每一次从一个新的起始点出发进行搜索过程...
  • 连通图的割点、割边 连通图的割点、割边(桥)、块、缩点,有向图的强连通分量 一、基本概念 无向图 割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的 子图。 块:没有割点的连通子图 割边:...
  • 因为有向图中一个点经过两种路线到达另一个点未必形成环,因此有向无环图未必能转化成树,但任何有向树均有向无环图。 性质:有向无环图的生成个数等于入度非零的节点的入度积。 2、代码结构
  • ——最小生成

    万次阅读 2018-11-01 14:40:48
    图——最小生成 1. 基本概念 在一个连通无向图G=(V, E)中,对于其中的每条边(u,v)∈E,赋予其权重w(u, v),则最小生成问题就是要在G中找到一个无环子集T ...
  • 很多题目其实可以转化为判断一个有向图是否有环的问题,比如leetcode上面的207. Course Schedule 根据上面的理论,解决该问题就轻而易举啦,代码如下(python) class Solution(object): def canFinish...
  • 有向无环DAG(代码及图解)

    千次阅读 2018-08-20 15:49:53
    目录: 1、有向无环图 2、代码结构 3、代码学习步鄹及方法 4、重点代码讲解 5、代码展现 ...——————————————...因为有向图中一个点经过两种路线到达另一个点未必形成环,因此有向无环图未必能转化成...
  • 无向连通的生成个数

    千次阅读 2015-03-14 09:27:37
    但是大家更熟悉的,是无向图的最小生成(MST)算法。本文旨在讨论计算无向连通图的生成个数的时间复杂度O(n3)的方法。另外一种时间效率高的递推式方法的讲解在文末附有链接。  我们可以利用矩阵在O(n3)...
  • //TODO//完成离线点云地图到八叉地图的转换//进一步在线实时完成点云地图到八叉地图的转换
  • 数据结构与算法 -- 结构与结构

    千次阅读 2018-12-27 20:12:35
    形式化定义:算法的集合(Tree)是由一个或多个结点组成的有限集合T,其中一个特定的称为根的结点;其余结点可分为(m≥0)个互不相交的有限集T1,T2,T3,…,Tm,每一个集合本身又是一棵,且称为根的子树。 逻辑...
  • 的最小生成与最短路径

    万次阅读 多人点赞 2014-09-03 11:22:58
    一个连通的生成是一个极小的连通子图,它含有中全部顶点,但只有足以构成一棵的n-1条边。那么我们把构造连通网的最小代价生成称为最小生成。 找连通网的最小生成,经典的两种算法,普里姆算法和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,703
精华内容 23,081
关键字:

有向图转化为树