精华内容
下载资源
问答
  • g(n)为n个顶点的非联通 则f(n) + g(n) = h(n) = 2^(n * (n - 1) / 2) 其中h(n)是n个顶点的联图的个数 这样计算 先考虑1所在的连通分量包含哪些顶点 假设该连通分量k个顶点C(n - 1, k - 1)种集合 ...

    设f(n)为所求答案

    g(n)为n个顶点的非联通图

    则f(n) + g(n) = h(n) = 2^(n * (n - 1) / 2)

    其中h(n)是n个顶点的联图的个数


    这样计算

    先考虑1所在的连通分量包含哪些顶点

    假设该连通分量有k个顶点

    就有C(n - 1, k - 1)种集合

    确定点集后,所在的连通分量有f(k)种情况。其他连通分量有 h(n - k)种情况

    因此有递推公式。g(n) = sum{ C(n - 1, k - 1) * f(k) * h(n - k)} 其中k = 1,2...n-1

    注意每次计算出g(n)后立刻算出f(n)


    import java.math.BigInteger;
    import java.util.Scanner;
    
    
    public class Main {
    
    	
    	public static void main(String[] args) {
    		BigInteger two[] = new BigInteger [55];
    		two[0] = BigInteger.ONE;
    		for(int i = 1; i <= 50; i++)
    			two[i] = two[i - 1].multiply(BigInteger.valueOf(2));
    		BigInteger h[] = new BigInteger [55];
    		for(int i = 1; i <= 50; i++){
    			int a = i;
    			int b = i - 1;
    			if(a % 2 == 0) a/= 2;
    			else b /= 2;
    			h[i] = BigInteger.ONE;
    			for(int j = 0; j < a; j++) {
    				h[i] = h[i].multiply(two[b]);
    			}
    		}
    		BigInteger C[][] = new BigInteger[55][55];
    		C[0][0] = BigInteger.ONE;
    		for(int i = 0; i <= 50; i++){
    			C[i][0] = C[i][i] = BigInteger.ONE;
    			for(int j = 1; j < i; j++){
    				C[i][j] = C[i - 1][j].add(C[i - 1][j - 1]);
    			}
    		}
    		BigInteger f[] = new BigInteger[55];
    		BigInteger g[] = new BigInteger[55];
    		f[1] = BigInteger.ONE;
    		for(int i = 2; i <= 50; i++) {
    			g[i] = BigInteger.ZERO;
    			for(int j = 1; j < i; j++) {
    				g[i] = g[i].add(C[i - 1][j - 1].multiply(f[j]).multiply(h[i - j]));
    			}
    			f[i] = h[i].subtract(g[i]);
    		}
    		int n;
    		Scanner cin = new Scanner(System.in);
    		while(cin.hasNext()){
    			n = cin.nextInt();
    			if(n == 0) break;
    			System.out.println(f[n]);
    		}
    	}
    
    }
    


    展开全文
  • 证明每个有n个顶点连通图都至少有n-1条边 证明:不妨设G是无向连通图(若G为向图,可忽略边的方向讨论对应的底图)。 设G中顶点为v1, v2, ..., vn。由连通性,必存在与v1相邻的顶点,不妨设其为v2(否则,可...

    Show that every connected graph with n vertices has at least n − 1 edges.
    证明每个有n个顶点的连通图都至少有n-1条边

    证明:不妨设G是无向连通图(若G为有向图,可忽略边的方向讨论对应的底图)。

    设G中顶点为v1, v2, ..., vn。由连通性,必存在与v1相邻的顶点,不妨设其为v2(否则,可重新编号),连接v1与v2得边e1,还是由连通性,在v3, v4, ..., vn中必存在与v1或v2相邻的顶点,不妨设为v3,将其连接得边e2,续行此法,vn必与v1, v2, ..., vn-1中的某顶点相邻,得新边\large e_{(n-1)},由此可见G中至少有n-1条边。

     

    而有关正整数n的命题通常可以用数学归纳法加以证明

    归纳基础:0、1显然成立。

    归纳假设:带有k个顶点的连通图至少具有k-1条边。

    下面我们来证明带有k+1个顶点的连通图至少具有k条边。我们把k+1个顶点分成两部分,一部分含有k个顶点,一部分只有一个顶点,对于k个顶点的连通图我们知道它至少具有k-1条边,我们只需要这样构造:把那个孤立的顶点与k个顶点中的任何一个连接形成一条边,那么显然带有k+1个顶点的连通图至少具有k条边。

    展开全文
  • 22个顶点连通图中边的条数至少为() 正确答案: C 你的答案: 空 (错误) 18 20 21 23 添加笔记 求解答(4) 收藏 纠错 n个顶点连通图至少有n-1条边(树); n个顶点的简单图(完全图)至少...

    22个顶点的连通图中边的条数至少为()

    正确答案: C   你的答案: 空 (错误)

    18
    20
    21
    23


    n个顶点的连通图至少有n-1条边(树);
    n个顶点的简单图(完全图)至少有n*(n-1)/2条边。
    所以选C

    展开全文
  • 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly ...

    有向图强连通分量的Tarjan算法

    [有向图强连通分量]

    在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。

    下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。

    image

    直接根据定义,用双向遍历取交集的方法求强连通分量,时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法,两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。

    [Tarjan算法]

    Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。

    定义DFN(u)为节点u搜索的次序编号(时间戳),Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。由定义可以得出,

    Low(u)=Min
    {
        DFN(u),
        Low(v),(u,v)为树枝边,u为v的父节点
        DFN(v),(u,v)为指向栈中节点的后向边(非横叉边)
    }
    

    当DFN(u)=Low(u)时,以u为根的搜索子树上所有节点是一个强连通分量。

    算法伪代码如下


    tarjan(u)
    {
        DFN[u]=Low[u]=++Index                      // 为节点u设定次序编号和Low初值
        Stack.push(u)                              // 将节点u压入栈中
        for each (u, v) in E                       // 枚举每一条边
            if (v is not visted)               // 如果节点v未被访问过
                tarjan(v)                  // 继续向下找
                Low[u] = min(Low[u], Low[v])
            else if (v in S)                   // 如果节点v还在栈内 tanc 如果v不在栈内,那一定不和u属于一个联通块因为之前搜索过v了 反证法
                Low[u] = min(Low[u], DFN[v])
        if (DFN[u] == Low[u])                      // 如果节点u是强连通分量的根
            repeat
                v = S.pop                  // 将v退栈,为该强连通分量中一个顶点
                print v
            until (u== v)
    }
    

    接下来是对算法流程的演示。

    从节点1开始DFS,把遍历到的节点加入栈中。搜索到节点u=6时,DFN[6]=LOW[6],找到了一个强连通分量。退栈到u=v为止,{6}为一个强连通分量。

    image

    返回节点5,发现DFN[5]=LOW[5],退栈后{5}为一个强连通分量。

    image

    返回节点3,继续搜索到节点4,把4加入堆栈。发现节点4向节点1有后向边,节点1还在栈中,所以LOW[4]=1。节点6已经出栈,(4,6)是横叉边,返回3,(3,4)为树枝边,所以LOW[3]=LOW[4]=1。

    image

    继续回到节点1,最后访问节点2。访问边(2,4),4还在栈中,所以LOW[2]=DFN[4]=5。返回1后,发现DFN[1]=LOW[1],把栈中节点全部取出,组成一个连通分量{1,3,4,2}。

    image

    至此,算法结束。经过该算法,求出了图中全部的三个强连通分量{1,3,4,2},{5},{6}。

    可以发现,运行Tarjan算法的过程中,每个顶点都被访问了一次,且只进出了一次堆栈,每条边也只被访问了一次,所以该算法的时间复杂度为O(N+M)。

    求有向图的强连通分量还有一个强有力的算法,为Kosaraju算法。Kosaraju是基于对有向图及其逆图两次DFS的方法,其时间复杂度也是O(N+M)。与Trajan算法相比,Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS,不用建立逆图,更简洁。在实际的测试中,Tarjan算法的运行效率也比Kosaraju算法高30%左右。此外,该Tarjan算法与求无向图的双连通分量(割点、桥)的Tarjan算法也有着很深的联系。学习该Tarjan算法,也有助于深入理解求双连通分量的Tarjan算法,两者可以类比、组合理解。

    求有向图的强连通分量的Tarjan算法是以其发明者Robert Tarjan命名的。Robert Tarjan还发明了求双连通分量的Tarjan算法,以及求最近公共祖先的离线Tarjan算法,在此对Tarjan表示崇高的敬意。

    附:tarjan算法的C++程序

    void tarjan(int i)
    {
        int j;
        DFN[i]=LOW[i]=++Dindex;
        instack[i]=true;
        Stap[++Stop]=i;
        for (edge *e=V[i];e;e=e->next)
        {
            j=e->t;
            if (!DFN[j])
            {
                tarjan(j);
                if (LOW[j]<LOW[i])
                    LOW[i]=LOW[j];
            }
            else if (instack[j] && DFN[j]<LOW[i])
                LOW[i]=DFN[j];
        }
        if (DFN[i]==LOW[i])
        {
            Bcnt++;
            do
            {
                j=Stap[Stop--];
                instack[j]=false;
                Belong[j]=Bcnt;
            }
            while (j!=i);
        }
    }
    void solve()
    {
        int i;
        Stop=Bcnt=Dindex=0;
        memset(DFN,0,sizeof(DFN));
        for (i=1;i<=N;i++)
            if (!DFN[i])
                tarjan(i);
    }
    展开全文
  • 思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点。利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, …,...
  • N个结点的连通图的边数问题

    千次阅读 2015-09-05 11:13:08
    数据结构,N个顶点连通图至少要N-1)条边(也就是树)才能保证图为连通图. 对于简单图而言至多有n*(n-1)/2条边,此时即是完全图. 强连通图最多n(n-1)条边,最少n-1条边. 强连通图:任意两个顶点都相互...
  • 给定n个互不相同的顶点,求它们可以构成的不相同的无向连通图数量 http://poj.org/problem?id=1737 2、算法思路 引文思路描述对我来说有点抽象,这里尝试再说细一些(引文:...
  • 无向顶点连通

    千次阅读 2019-09-22 10:04:15
    无向顶点连通度需要用到网络流来求,并且以下定理; Mengerg定理: 无向顶点连通度K和顶点间的最大独立轨数目之间存在如下关系: ① 当为完全时: k=V-1 (V表示中顶点数) ② 当为非...
  • n个顶点,m条边的全连通图,至少去掉____边才能构成一棵树? 正确答案: C n-1 m-1 m-n+1 m-n-1 添加笔记 收藏 纠错 Google面试题,n个顶点的树一定有n-1条边...
  • 顶点连通度和边连通度

    千次阅读 2016-03-18 15:59:42
    思路:从网上找了一下大牛对于这类问题的总结:连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两点s和t不连通 (不存在从s到t的路径),求至少要删去几元素。  连通度分为点连通度...
  • 在有向图, 若对于每一对顶点v1和v2, 都存在一条从v1到v2和从v2到v1的路径,则称此图是强连通图。 弱连通图: 将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一有向图的基图是连通图,则有...
  • (二)什么是连通图,(强)连通图详解

    万次阅读 多人点赞 2019-03-18 11:37:24
    前面讲过,图从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。...无向图,如果任意两个顶点之间都能够连通,则称此无向图为连通图。例如,图 2 的无向图就是一连...
  • 问:n节点的连通图的个数多少?(节点不同) 大约1月前,下到ltc的做男人不容易系列就看到了这题目。但是讲解soso的简单,我说实在话也想不出来。 今天发现是pku1337的题目,又看到了别人的思路,才想通,...
  • //从顶点Vx出发,开始深度遍历求连通图向图的生成树的算法//Vx是连通图中任意一个顶点,或向图任意一根void dfstree(int x){//从x开始深度遍历 int mark[n0+1]; //标记某个节点是否被访问过了 ...
  • 给定编号从 0 到 n-1 的 n 节点和一无向边列表(每条边都是一对节点),请编写一函数来计算无向图中连通分量的数目。 示例 1: 输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]] 0 3 | | 1 --- 2 4 输出:...
  • 连通图与简单图

    千次阅读 2016-12-02 10:52:22
    n个顶点连通图至少有n-1条边(树); n个顶点的简单图(完全图)至少有n*(n-1)/2条边。
  • 如果网络任何两中继器之间至少一条路,则中继器网络称为是连通的,否则中继器网络是不连通的。一空的网络、以及只有一中继器的网络被认为是连通的。具有n 中继器的网络的安全系数f 被定义成: (1) f 为...
  • 是否一种着色法使G每条边的两个顶点有不同的颜色? 问题分析 这问题是的m可着色判定问题。 若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这数m为这个图的色数。 求一个图...
  • 假设图G采用邻接表存储,设计一算法,求不带权无向连通图G顶点u->v的最短路径(路径上经过的顶点数最少。采用广度优先遍历来实现。 基本思路 我们首先来看一下BFS的过程: 图片摘自慕课网李春葆老师讲的...
  • 判断一图是否为强连通图、单向连通图、弱连通图。输入为向图的邻接矩阵。 输入 输入若干行 第一行为正整数N(0 接下来N行,每行有N个数据,每数据以空格分隔,代表邻接矩阵。 注意:输入的都是连通图。 输出...
  • 题意:一无向n个点,m条边,求此顶点连通度。 思路:顶点连通度,即最小割点集里的割点数目,一般求无向图顶点连通度的方法是转化为网络流的最小割。 建图: (1)原点i拆点,拆为i‘和i’...
  • 连通图

    2020-05-20 16:45:16
    n 表示顶点数目,m 表示图中边的数目。随后 m 行数据,每行值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。 输出描述: 对于每组输入数据,...
  • (1)一具有 N 个顶点去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通,  而去掉 K 个顶点后的连通则称 G 是连通的, K 称作 G 的点连通度,记作 K(G) 试设计 (2)相应地如果至少去掉 K 条边使这...
  • 思想:图G是不带权的无向连通图,一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列。利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地向外扩展...
  • 无向的最大独立轨。 独立轨:设A、B是无向G的两顶点,从A到B的两条没有公共内部顶点的路径互称为独立...关于无向G顶点连通度K(G)与顶点独立轨之间的关系。 Menger定理: K(G) = |V(G)| - 1 当G是完全
  • 目录题目题解答案2018 无向连通图最少包含多少条边 题目 问题描述 一包含2019结点的无向连通图,最少包含多少条边?...一个有n个顶点的无向连通图最多有nn-1)/2条边,最少有n-1条边。 答案 2018 ...
  • 数据结构_图_定义/分类/顶点与边之间的关系/连通图/存储结构/基本操作
  • 对于一个有桥的连通图,加边变成边双连通图 1.求出所有的桥,然后删除这些桥边。剩下的每连通块都是一双连通子图。 2.把每双连通子图收缩为一个顶点。 3.加回桥边,统计度为1的节点的个数(叶节点的个数)...
  • PTA上的题目答案绝大多数都是c或者c++的,很少Java的,这是我和一学C的朋友一起写出来的,分享给大家 先给大家看看结果, 代码如下,我也有些不太理解的地方,欢迎大家留言,一起讨论 import java.io....
  • 向完全图和强连通图的区别?

    千次阅读 2020-08-14 10:52:27
    向完全图和强连通图的区别?其他概念: 首先了解概念 相邻关系:两个顶点之间存在一条边,则表示两个顶点具有相邻关系 路径:相邻顶点序偶所构成的序列 路径长度:路径上边的数目 回路:若一条路径第一个顶点和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,826
精华内容 12,330
关键字:

在有n个顶点的连通图中