精华内容
下载资源
问答
  • 请输出无向连通图最小生成树权重之和。 输入 第一行是2整数,分别表示顶点个n和边数m。接下来的m行中,每一行第一整数表示边的开始顶点,第二表示边的结束顶点,第三表示这条边的权重。 ( 测试数据中保证图...
  • 请输出无向连通图最小生成树权重之和。 输入 第一行是2整数,分别表示顶点个n和边数m。接下来的m行中,每一行第一整数表示边的开始顶点,第二表示边的结束顶点,第三表示这条边的权重。
  • 目录题目题解答案2018 无向连通图最少包含多少条边 题目 问题描述 一包含有2019结点的无向连通图,最少包含多少条边?...一n个顶点无向连通图最多有nn-1)/2条边,最少有n-1条边。 答案 2018 ...

    题目:无向连通图最少包含多少条边

    问题描述
    一个包含有2019个结点的无向连通图,最少包含多少条边?

    答案提交
    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    题解

    一个有n个顶点的无向连通图最多有n(n-1)/2条边,最少有n-1条边。

    答案

    2018

    展开全文
  • 因为的广度优先遍历方式是从的某个顶点开始,由近至远层层拓展的方式遍历结点的过程,因此的广度优先遍历的最后一结点一定是距离该顶点最远的一结点。 #define MaxSize 10 //邻接表定义 typedef struct...

    因为图的广度优先遍历方式是从图的某个顶点开始,由近至远层层拓展的方式遍历图结点的过程,因此图的广度优先遍历的最后一个结点一定是距离该顶点最远的一个结点。

    #define MaxSize 10
    
    //邻接表定义
    typedef struct ArcNode{
        struct ArcNode* nextArc;
        int arcNum;
    }ArcNode;
    
    typedef struct{
        ArcNode* fristArc;
        char data;
    }VNode;
    
    typedef struct{
        VNode adjList[MaxSize];
        int n;
        int e;
    }AGraph;
    
    void initAGraph(AGraph* &G){
        G->e = 5;
        G->n = 6;
        cout<<"data:"<<endl;
        for (int i = 0; i < G->n; i++) {
            cin>>G->adjList[i].data;
            G->adjList[i].fristArc = NULL;
        }
        cout<<"vi,vj"<<endl;
        for (int j = 0; j < G->e; j++) {
            int vi,vj;
            cin>>vi>>vj;
            ArcNode* node = new ArcNode();
            node->arcNum = vj;
            node->nextArc = G->adjList[vi].fristArc;
            G->adjList[vi].fristArc = node;
        }
    }
    
    void ArcVisit(VNode node){
        cout<<"current: "<<node.data<<endl;
    }
    
    int visit[MaxSize];
    
    int BFS(AGraph* G,int v){
        //recursion terminator
        if (G == NULL) {
            return -1;
        }
        int queue[MaxSize];
        int front = 0;
        int rear = 0;
        int num = v;
        
        //root gets into queue;
        rear = (rear + 1)%MaxSize;
        queue[rear] = num;
        ArcVisit(G->adjList[num]);
        visit[num] = 1;
        ArcNode* node;
        
        //process logic
        while(front != rear) {
            front = (front + 1)%MaxSize;
            num = queue[front];
            node = G->adjList[num].fristArc;
            while (node) {
                if (visit[node->arcNum] == 0) {
                    ArcVisit(G->adjList[node->arcNum]);
                    visit[node->arcNum] = 1;
                    rear = (rear+1)%MaxSize;
                    queue[rear] = node->arcNum;
                }
                node = node->nextArc;
            }
        }
        return num;
    }
    
    int main(int argc, const char * argv[]) {
        AGraph* G = new AGraph();
        initAGraph(G);
        cout<<"Last:"<< BFS(G, 0)<<endl;
        return 0;
    }
    
    展开全文
  • 无向连通图小结

    2019-03-01 09:41:00
    桥的概念:无向删去边e后分裂成两不相连的子图 割点概念:无向删去点v以及和v相连的所有边后分裂成两及以上的子图 一些概念:  搜索树:在无向中任意选择一点作为起点进行dfs,每点访问一次,每次...

    无向图:桥和割点

    桥的概念:无向图删去边e后分裂成两个不相连的子图

    割点概念:无向图删去点v以及和v相连的所有边后分裂成两个及以上的子图

    一些概念:

      搜索树:在无向图中任意选择一点作为起点进行dfs,每个点访问一次,每次发生递归的边(x,y),即访问到之前没有访问到的点所经过的边,组成的搜索树

      时间戳:在dfs过程中无向图中的结点被访问到的时间,用dfn数组来表示

      追溯值:用low数组表示追溯值,low[x]定义为以下结点的时间戳的最小值:

          1.x 子孙结点的时间戳

          2.x子孙能通过非搜索树上的边所达到的点的时间戳

    桥的判定法则:无向边(x,y)是桥 <==> 搜索树上存在x的一个子节点y,有dfn[x]<low[y]

      推论:桥一定是搜索树中的边,一个简单环中的边一定都不是桥

    割点的判定法则:如果x是root,那么如果x有两个及以上儿子,x就是割点

            如果x非root,那么如果搜索树上存在x的一个子节点y,有dfs[x]<=low[y],那么x就是割点

     求桥时要特别注意一下重边和父边!

    下面是求桥和割点的代码

     

    void Tarjan(int u,int pre){
        low[u]=dfn[u]=++index;
        int son=0,pre_cnt=0;//处理重边和回边
        for(int i=head[u];i!=-1;i=edge[i].nxt){
            int v=edge[i].to;
            if(v==pre&&pre_cnt==0){
                pre_cnt++;continue;
            }
            if(!dfn[v]){//如果v未被访问过 
                son++;
                Tarjan(v,u);
                low[u]=min(low[u],low[v]);
                if(dfn[u]<low[v]){//
                    bridge++;
                    edge[i].cut=true;
                    edge[i^1].cut=true;
                } 
                if(u!=pre && dfn[u]<=low[v]){//非树根的割点 
                    cut[u]=true;
                    add_block[u]++;
                }
            }
            else low[u]=min(low[u],dfn[v]);//v被访问过了 
        } 
        if(u==pre && son>1)cut[u]=true;//树根割点 
        if(u==pre)add_block[u]=son-1; 
    }

     

    无向图:双联通分量

    点双联通图:无向连通图不存在割点

    边双联通图:无向连通图不存在桥

    点双联通分量:无向图的极大点双联通子图v-DCC

    边双联通分量:无向图的极大边双联通子图e-DCC

    定理

      点双联通图的判定条件:

        1.图的顶点数不超过2

        2.图中任意两点至少包含在一个简单环中

      边双联通图的判定条件:

        1.图中任意一条边都包含在一个简单环中

     

    e-DCC的求法:只要求出图中所有桥,把桥删掉后图分裂成的联通块就是e-DCC

    先把桥都求出来,然后一次dfs进行染色,数组c[x]表示x所在的联通块的编号

    int c[maxn],dcc;
    void dfs(int u){
        c[u]=dcc;
        for(int i=head[u];i!=-1;i=edge[i].nxt){
            int v=edge[i].to;
            if(c[v] || bridge[i])continue;//碰到桥就不往下dfs
            dfs(v); 
        }
    }
    int main(){
        //...
        dcc=0;
        for(int i=1;i<=n;i++)
            if(!c[i]){
                ++dcc;
                dfs(i);
            }
        //...
    }

    e-DCC的缩点法,把每个边双联通分量缩成一个点,将原图变成一棵树或森林,存在新的邻接表中

    这个过程中同样可以求出每个缩点的度数

    struct Edge{
        int to,nxt;
    }edge_c[maxn<<1];
    int head_c[maxn],tot_c;
    void init(){
        memset(head_c,-1,sizeof head_c);
        tot_c=0;
    }
    void add_c(int u,int v){
        edge_c[tot_c].to=v;
        edge_c[tot_c].nxt=head_c[u];
        head_c[u]=tot_c++;
    }
    int main(){
        //...
        for(int i=0;i<tot;i+=2){
            int v=edge[i].to,u=edge[i^1].to;//无向图的两条边一定连在一起 
            if(c[u]==c[v])continue;
            add_c(c[u],c[v]);
        }
        //...    
    }

     

    v-DCC的求法:需要在Tarjan算法中维护一个栈

      1.当结点x第一次被访问时,把该节点入栈

      2.当dfn[x]<=low[y]条件成立时,无论x是否为根都要

        a.从栈顶不断弹出结点,直到结点 y 被弹出!!!(注意是y,不用担心同一个联通分量的点会被分成两个)

        b.刚才弹出的所有结点与结点x一起构成一个v-DCC

      开一个vector数组dcc,dcc[i]保存编号为i的v-DCC中的所有结点

    vector<int>dcc[maxn];
    int cnt;
    void tarjan(int x){
        dfn[x]=low[x]=++index;
        stack[++top]=x;
        if(x==root && head[x]==-1){//x是个孤立点 
            dcc[++cnt].push_back(x);
            return;
        }
        int flag=0;
        for(int i=head[x];i!=-1;i=edge[i].nxt){
            int y=edge[i].to;
            if(!dfn[y]){
                tarjan(y);
                low[x]=min(low[x],low[y]);
                if(low[y]>=dfn[x]){
                    flag++;
                    if(x!=root || flag>1)cut[x]=true;//独立判断一次x是割点 
                    cnt++;
                    int z;
                    do{//退栈 
                        z=stack[top--];
                        dcc[cnt].push_back(z);
                    }while(z!=y);
                    dcc[cnt].push_back(x);//x也要进栈,但是x可能作为割点会被两个及以上联通分量包含,暂时不出栈 
                }
            }
            else low[x]=min(low[x],dfn[y]); 
        }
    } 

    v-DCC的缩点

    设图中有p个割点,t个v-DCC,缩点后的图有p+t个点

    把每个DCC和每个割点都作为新图中的结点,并在每个割点与包含它的所有v-DCC之间连边

     先给所有的割点新编号

    int main(){
        //...
        num=cnt;
        for(int i=1;i<=n;i++)
            if(cut[x])new_id[x]=++num;//给割点新编号
             
        tot_c=0;
        for(int i=1;i<=cnt;i++)//枚举每个联通分量 
            for(int j=0;j<dcc[i].size();i++){
                int x=dcc[i][j];
                if(cut[x]){//割点和联通分量连边 
                    add_c(i,new_id[x]);
                    add_c(new_id[x],i); 
                } 
                else c[x]=i;//染色 
            }
        //...
    }

     

    转载于:https://www.cnblogs.com/zsben991126/p/10454158.html

    展开全文
  • 第十一届 蓝桥杯 省 模拟赛 完整题目+题解地址为:第十一届 蓝桥杯 省 模拟赛 ...一包含有2019结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为...

      大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客亓官劼的博客2


    第十一届 蓝桥杯 省 模拟赛 完整题目+题解地址为:第十一届 蓝桥杯 省 模拟赛 试题+题解

    题目

    问题描述

    一个包含有2019个结点的无向连通图,最少包含多少条边?

    答案提交

    这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

    题解

    ​ 这是一个填空题,只需要填写答案即可。一个n个结点的无相连通图最少需要N-1条边。需要注意这里是无向的。所以答案为2018

    展开全文
  • 证明:不妨设G是无向连通图(若G为有向图,可忽略边的方向讨论对应的底图)。 设G中顶点为v1, v2, ..., vn。由连通性,必存在与v1相邻的顶点,不妨设其为v2(否则,可重新编号),连接v1与v...
  • private static int INFINITY = 32767; //定义无穷大的常量 private static int MAX_VERTEX = 1000; //定义数组的最大长度 static class MatrixGraph { //存储每条边代价的矩阵,行和... //vertexCount:顶点个数 e
  • 昨晚考研的朋友发来这道题,平日很少接触的算法,只会深度优先遍历和层次优先遍历,正好可以巩固一下。自己简单测了几组数据,都没问题。不知道有没有存在隐藏的bug,如果有人可以帮我指出感激不尽。 关于结点的...
  • 给定编号从 0 到 n-1 的 n 节点和一个无向边列表(每条边都是一对节点),请编写一函数来计算无向连通分量的数目。 示例 1: 输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]] 0 3 | | 1 --- 2 4 输出:...
  • 包含有2019结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一整数,在提交答案时只填写这整数,填写多余的内容将无法得分。 有来n个顶点...
  • 做了一些连通图的专题,发现在题目中的特殊情况下需要判断当前连通图是一还是多,而既然提出了这问题,就说明在有的问题中需要考虑这种情况。 拿HDU4738为例,这道题中,如果是给定边组成了一个连通图的话...
  • 对于给定的无向连通图G和m种不同的颜色计算图的所有不同着色法 问题描述 给定无向连通图G和m种不同的颜色。...你的任务是对于给定的无向连通图G和m种不同的颜色,编写一JAVA程序来计算无向图G的所...
  • 存在一n 节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号。 给你一数组 graph 表示这图。其中,graph[i] 是一列表,由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的长度...
  • 源代码: #include<...#define MVNum 100 //最大顶点数 typedef char VerTexType; //定义数据类型 typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; //顶点表 ArcType ...
  • 无向连通图的生成树

    千次阅读 2015-03-14 09:27:37
    我们知道,每个无向连通图都会有自己的生成树。但是大家更熟悉的,是无向图的最小生成树(MST)算法。本文旨在讨论计算无向连通图的生成树数的时间复杂度为O(n3)的方法。另外一种时间效率高的递推式方法的讲解在文...
  • 无向连通图中,删除一个顶点v及其相连的边后,原图从一连通分量变成了两或多连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一没有关节点的连通图称为重连通图(biconnected graph)。若...
  • 无向连通图的割点(图论)

    千次阅读 2016-06-06 19:29:41
    无向连通图中,删除一个顶点v及其相连的边后,原图从一连通分量变成了两或多连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一没有关节点的连通图称为重连通图(biconnected graph)。若...
  • 给定n个互不相同的顶点,求它们可以构成的不相同的无向连通图数量 http://poj.org/problem?id=1737 2、算法思路 引文思路描述对我来说有点抽象,这里尝试再说细一些(引文:...
  • 所以队列中的最后一节点一定是距离给定节点最远的点。 代码实现 vector模拟邻接表代码 #include <iostream> #include <vector> #include <queue> using namespace std; const int MAXN = ...
  • 直接上代码,详细请见注释... * 假设当前我们拥有一 地区的城市地图,但是只有一原子弹,为了让这颗原子弹发挥最大的效果,要阻断这地区各个城市中最关键的一交通要塞,那么这原子弹该投放在哪里? * 其...
  • g(n)为n个顶点的非联通 则f(n) + g(n) = h(n) = 2^(n * (n - 1) / 2) 其中h(n)是n个顶点的联图的个数 这样计算 先考虑1所在的连通分量包含哪些顶点 假设该连通分量有k个顶点 就有C(n - 1, k - 1)种集合 ...
  • 利用二元前缀码译码:从第一字符开始一次读入每字符(0 或 1),如果发 现读到的子串与某个码字相等,就将这子串译作对应的码字;然后从下一字符开始继续这过程,直到读完输入的字符串为止。 二元前缀编码...
  • 图例: ... 普里姆算法:假设N={v,{E}}是连通图,TE是N上的最小生成树中边的集合,算法从U={u0}(u0属于V),TE={}开始,重复执行下述操作:  在所有u属于U,v属于V-U的边属于E中找一条代价最
  • 图论——寻找无向连通图割点算法

    千次阅读 多人点赞 2016-12-20 20:51:03
    查看原文:...首先,如果一个连通的无向中的任意顶点删除之后,剩下的如果仍然连通,那么这
  • Prim求无向连通图最小生成树

    千次阅读 2016-07-26 14:41:52
    它的核心步骤如下:初始化:向空树T=(VT,ET)中添加G=(V,E)的任一顶点u0,使VT={u0},ET=空集循环(重复下列操作至VT=V): 从G中选择满足{(u,v)| u属于VT,v属于V-VT}且具有最小权值得边(u,v),并置VT=VT...
  • 设G=(V, E)是一个无向连通图,如果顶点集V可分割为两互不相交的子集A、B,并且边集E中的每条边(i, j)所关联的两个顶点i和j分别属于这两不同的顶点集(i in A, j in B),则称无向连通图G为一二分图。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,040
精华内容 3,616
关键字:

具有n个顶点的无向连通图