C++最小生成树问题

问题描述

求一个连通无向图的最小生成树的代价(图边权值为正整数)。

输入

第一行是一个整数N(1<=N<=20),表示有多少个图需要计算。以下有N个图,第i图的第一行是一个整数M(1<=M<=50),表示图的顶点数,第i图的第2行至1+M行为一个M*M的二维矩阵,其元素ai,j表示图的i顶点和j顶点的连接情况,如果ai,j=0,表示i顶点和j顶点不相连;如果ai,j>0,表示i顶点和j顶点的连接权值。

输出

每个用例,用一行输出对应图的最小生成树的代价。

样例输入

1

6

0 6 1 5 0 0

6 0 5 0 3 0

1 5 0 5 6 4

5 0 5 0 0 2

0 3 6 0 0 6

0 0 4 2 6 0

样例输出

15

分析:

   很明显,这是一个无向图,因为我们看到这个矩阵,它是对称的。

=>我们取它的左下角元素来进行操作,代码里就是让行 i 大于列 j.

=>存在结构体里面,按边的长度由小到大排序。

=>因为有n个顶点,所以我们要记录它各个顶点的值,来判断两个顶点之间是不是已经有边连接。

下面说一下分析步骤:

我的由输入得到这个图:

从长度由小到大连接,符合条件(a[i]不等于a[j])的就操作,其它的不操作:

每一步都要把值与左边的值相同的全设置为右边的数:

两端数值相等就不要操作了。

最后把符合条件的边的长度加起来就是我们求的最小生成树的代价。

代码:

#include<iostream>
using namespace std;
struct node
{
 int l;
 int r;
 int len;
 node *next;
};
void insert(node *&h,node *p)   //指针插入排序
{
 node *q=h;
 while(q->next && q->next->len <= p->len)
 {
  q=q->next;
 }
 p->next=q->next;
 q->next=p;
}
int main()
{
// freopen("001.in","r",stdin);
 node *h,*p;
 int n,m,x,temp;
 int *a;
 int i,j;
 int sum;
 cin>>n;
 while(n--)
 {
  sum=0;
  cin>>m;
  a=new int[m+1];
  for (i=1;i<=m;i++)
  {
   a[i]=i;
  }
  h=new node;
  p=h;
  p->next=NULL;
  for (i=1;i<=m;i++)
   for (j=1;j<=m;j++)
   {
    cin>>x;
    if (i>j && x!=0)
    {
     p=new node;
     p->l=i;
     p->r=j;
     p->len=x;
     p->next=NULL;
     insert(h,p);   //调用插入排序
    }
   }
          p=h->next;
   while (p)
   {
    if (a[p->l]!=a[p->r])
    {
    
     sum+=p->len;
     temp=a[p->l];
     for(i=1;i<=m;i++)
      if (a[i]==temp)
      {
       a[i]=a[p->r];
      }
    }
   p=p->next;
   }
   /*   可以测试程序工作是否正常
   p=h->next;
   while(p)
   {
    cout<<p->l<<':';cout<<p->r<<' ';
    cout<<p->len<<"   ";
    p=p->next;
   }
   */
   cout<<sum<<endl;  
 }
 return 0;
}

时间: 2024-09-13 01:34:09

C++最小生成树问题的相关文章

图-最小生成树问题,求大神解答???

问题描述 最小生成树问题,求大神解答??? 我想问: 在一个图中,求一个最小生成树,要求,必须过指定的几个点,而且这几个指定的点还不一定直接相连,请问怎么做??? 解决方案 既然是最小生成树,自然是所有节点都要经过.什么叫经过指定的点.是指定的边吧. 解决方案二: 每个点作为起点往上找,直到顶点或者是已经找到过的点跳出 解决方案三: 可以用后序遍历的方式遍历整棵树 首先判断叶子是不是指定的结点 如果不是,就删除该结点 如果是就继续遍历 其实就是让树从下往上,从左往右开始考虑 把指定结点以下的结点

111-最小生成树问题,c代码

问题描述 最小生成树问题,c代码 题目描述 Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. Farmer John ordered a high speed connection for his farm an

poj 1639 Picnic Planning:最小度限制生成树

链接: http://poj.org/problem?id=1639 题目: Picnic Planning Time Limit: 5000MS     Memory Limit: 10000K Total Submissions: 7780     Accepted: 2726 Description The Contortion Brothers are a famous set of circus clowns, known worldwide for their incredible

UVa 10034:Freckles (最小生成树模板题)

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=975 题目: Problem A: Freckles In an episode of the Dick Van Dyke show, little Richie connects the freckles on his Dad's back to fo

[综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10

C#数据结构与算法揭秘14

  好久, 没写blog了,今天,多写点.      上节说到那里了,是不是说图的遍历,这节,我们来通过图的具体的应用了.     首先,看看最小生成树的应用了. 什么是最小生成树了?    由生成树的定义可知,无向连通图的生成树不是唯一的,对连通图的不同遍历就得到不同的生成树.图 b 所示是图 (a)所示的无向连通图的部分生成树.      所谓最小生成树是 如果是一个无向连通网, 那么它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小代价生成树(Minimum Cost

最小生成树

                                                                                                                       最小生成树 1概述: 在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,代价最小生成树则称为最小生成树. 许多应用问题都是一个求无向连通图的最小生成树问题.例如:要在n个城市之间铺设光缆,主要目标是

《程序设计解题策略》——1.2 利用最小生成树及其扩展形式解题

1.2 利用最小生成树及其扩展形式解题 设G=(V,E,ω)是连通的有权无向图(节点集为V,边集为E,边权集为ω),连通图G中包含所有节点,且只有V-1条边的连通子图即为G的生成树.边权值和最小的生成树称为最小生成树.在现实生活中,最小生成树的原理和算法有着广泛的应用.程序设计竞赛中与最小生成树有关的试题一般有两类: 1) 构建最小生成树. 2) 应用最小生成树原理优化算法. 本节除了深入研讨最小生成树的性质和求解方法外,还给出了三种特殊类型生成树: 1) 最优比率生成树. 2) 最小k度限制生

Spark生态系统中的图数据分析知识

图结构可有效表示稀疏矩阵,因而图数据分析可用于实现大数据分析.对于Spark生态系统中的图处理系统GraphX,<Spark GraphX in Action>一书给出了详细的教程和典型用例,将教会读者如何使用GraphX和GraphFrames进行图分析.本文是Info对该书作者的访谈,内容包括图数据及分析技术.GraphX高效程序开发.图数据分析的趋势等. 如何定义图数据? Michael Malak:就事论事,图结构看上去并非像股价图那样,而是边和点的集合.但这只是一种模糊的数学抽象.更