纯C语言:贪心Prim算法生成树问题源码分享_C 语言

复制代码 代码如下:

#include <iostream.h>
#define MAX 100
#define MAXCOST 100000

int graph[MAX][MAX];

int Prim(int graph[MAX][MAX], int n)
{
 /* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */
 int lowcost[MAX];

 /* mst[i]记录对应lowcost[i]的起点 */
 int mst[MAX];

 int i, j, min, minid, sum = 0;

 /* 默认选择0号节点加入生成树,从1号节点开始初始化 */
 for (i = 1; i < n; i++)
 {
  /* 最短距离初始化为其他节点到0号节点的距离 */
   lowcost[i] = graph[0][i];

  /* 标记所有节点的起点皆为默认的0号节点 */
  mst[i] = 0;
 }

 /* 标记0号节点加入生成树 */
 lowcost[0] = 0;

 /* n个节点至少需要n-1条边构成最小生成树 */
 for (i = 1; i < n; i++)
 {
  min = MAXCOST;
  minid = 0;

  /* 找满足条件的最小权值边的节点minid */
  for (j =1; j <n; j++)
  {
   /* 边权值较小且不在生成树中 */
   if (lowcost[j] < min && lowcost[j] != 0)
   {
    min = lowcost[j];
    minid = j;
   }
  }
  /* 输出生成树边的信息:起点,终点,权值 */
  cout<<"生成数边的起点、终点及权值分别为:"<< mst[minid]+1<<"  "<<minid+1<<"  "<<min<<endl;
  /* 累加权值 */
  sum += min;

  /* 标记节点minid加入生成树 */
  lowcost[minid] = 0;

  /* 更新当前节点minid到其他节点的权值 */
  for (j = 1; j < n; j++)
  {
   /* 发现更小的权值 */
   if (graph[minid][j] < lowcost[j])
   {
    /* 更新权值信息 */
    lowcost[j] = graph[minid][j];

    /* 更新最小权值边的起点 */
    mst[j] = minid;
   }
  }
 }
 /* 返回最小权值和 */
 return sum;
}

void main()
{
 int i, j,  m,n;
 int  cost;
  /* 读取节点的数目 */
 cout<<"请输入该图结点个数:";
 cin>>m;
 /* 初始化图,所有节点间距离为无穷大 */
 for (i = 0; i <m; i++)
 {
  for (j =i+1; j <m; j++)
  {
   cout<<"请输入结点"<<i+1<<"到结点"<<j+1<<"边的权值,若无边则输入MAXCOST(100000):";
   cin>>n;
   graph[i][j] = n;
   graph[j][i] = n;
  }
  graph[i][i]=MAXCOST;
 }

 /* 求解最小生成树 */
 cost = Prim(graph, m);
 cout<<"最小生成树的权值为:"<<cost<<endl;
}

时间: 2024-09-12 00:52:16

纯C语言:贪心Prim算法生成树问题源码分享_C 语言的相关文章

纯C语言:递归二进制转十进制源码分享_C 语言

复制代码 代码如下: #include<stdio.h>#include<math.h>int change(int n,int *sum,int *m)//n为第n位,m总位数{    char c;    if(c!='#')    {        *m=*m+1;        change(n+1,sum,m);    }    if(c=='#')    {        return *sum=int(*sum+pow(2,*m-n));    }}void main

纯C语言:分治假币问题源码分享_C 语言

复制代码 代码如下: #include<stdio.h>int sum(int m,int n){ if(n==m||n==0)  return 1; else  return sum(m-1,n)+sum(m-1,n-1);}void main(){ int m,n; printf("请输入组合数中的m:"); scanf("%d",&m); printf("\n请输入组合数中的n:"); scanf("%d&qu

纯C语言:检索与周游广度深度遍历源码分享_C 语言

复制代码 代码如下: #include <stdio.h>typedef  int  datatype;   /*假定线性表元素的类型为整型*/#define  maxsize  1024    /*假定线性表的最大长度为1024*/# define n 100            /* 图的顶点最大个数 */typedef char VEXTYPE;  /* 顶点的数据类型 */typedef float ADJTYPE;  /* 权值类型 */typedef struct{  VEXTY

纯C语言:折半查找源码分享_C 语言

复制代码 代码如下: #include <stdio.h>       int bin_search(int key[],int low, int high,int k)      {        int mid;        if(low>high)    {       return -1;        }    else       {             mid = (low+high) / 2;             if(key[mid]==k)         

纯C语言:分治快速排序源码分享_C 语言

复制代码 代码如下: #include<stdio.h>void fun(int array[],int low,int high){    int i = low;    int j = high;      int temp = array[i];              while(i < j)     {  while((array[j] >= temp) && (i < j))  {    j--;    array[i] = array[j]; 

二叉搜索树源码分享_C 语言

复制代码 代码如下: #include <iostream>using namespace std; //枚举类,前中后三种遍历方式enum ORDER_MODE{ ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST}; //树节点的结构体template <class T>struct BinaryNode{ T    element; BinaryNode  *left; BinaryNode  *right;  Binar

C语言实现排序算法之归并排序详解_C 语言

排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件(相当于输入堆)放在同一向量中相邻的位置上:R[low..m],R[m+1..high],先将它们合并到一个局部的暂存向量R1(相当于输出堆)中,待合并完成后将R1复制回R[low..high]中. (1)合并过程 合并过程中,设置i,j和p三个指针,其初值分别指向这三个记录区的起始位置.合并时依次比较R[i

C语言实现的ls命令源码分享_linux shell

在之前的一些看书或者学习中,一直有一种感觉有问题的态度,那就是认为看懂了,但是不动手,感觉这样看书的效果不是很大.ls命令估计是我们在linux/unix里面用的最多的一个命令了,我们就用c来简单的实现一下ls命令. // // ls.c // apue // // Created by chenqing on 13-8-22. // Copyright (c) 2013年 chenqing. All rights reserved. // #include "/usr/include/apue

Cocos2d-x学习笔记之Hello World源码分析_C 语言

首先我们来说一下游戏的原理,游戏类似于一场电影,早期的电影不就是靠一张张的图片放出来的吗?把场景人物什么的画在一幅幅图片上,然后从第一张图片开始播放就可以了.游戏更是如此,其实我们玩的游戏看到的画面都是美工做出来的,我们程序员要做的事情是组织这些图片,比如先弄个背景图片,然后在某一个坐标上放置一个人物的图片,我们写好程序,控制这个图片的移动路径,等机器运行的时候每秒都要刷新画面,我们就看到人物动了起来.而刷新页面的快慢就是我们所说的帧率,这个在程序中我们可以控制.整体的意思就是游戏不过是一些图片